2012-01-11 85 views
1

我遇到了我的serverThreadProc()方法的问题。它在我运行它时抛出一个BindException。在try块的前两行中可能会遇到问题。不知道我在做错什么。BindException地址已经在使用

private void serverThreadProc() { 
    while (!this.stopRequested) { 
     Socket sessionSocket = null; 
     try { 
      serverSocket = new ServerSocket(serverPort); 
      sessionSocket = this.serverSocket.accept(); 
      InetAddress sourceAddress = sessionSocket.getInetAddress(); 
      Log.i(LOG_TAG, "Accepted new incoming connection ... " 
        + sourceAddress.toString()); 
      if (clientMap.containsKey(sourceAddress)) { 
       ClientProcessor legacyProcessor = clientMap 
         .get(sourceAddress); 
       legacyProcessor.shutdown(); 
      } 
      ClientProcessor processor = new ClientProcessor(sessionSocket); 
      processor.start(); 
      clientMap.put(sourceAddress, processor); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

public int start() { 
    try { 
     this.serverSocket = new ServerSocket(0); 
     this.serverPort = this.serverSocket.getLocalPort(); 
     Log.i(LOG_TAG, "Server " + serverName + " started at " 
       + this.serverSocket.getLocalSocketAddress()); 
    } catch (IOException ex) { 
     Log.i(LOG_TAG, ex.toString()); 
    } 

    this.serverThread.start(); 
    return this.serverPort; 
} 

public void stop() { 
    try { 
     stopRequested = true; 
     if (this.serverSocket) { 
      this.serverSocket.close(); 
     } 
    } catch (IOException ex) { 
     Log.i(LOG_TAG, ex.toString()); 
    } 

    Log.i(LOG_TAG, "The server " + this.serverName + " has been stopped."); 
} 

下面是由代码生成的堆栈跟踪:

01-11 05:51:53.472: I/ConnectActivity(2151): IP Address:0 
01-11 05:51:53.492: I/ServiceServer(2151): Server Whooznear started at /0.0.0.0:35434 
01-11 05:51:53.522: I/ConnectActivity(2151): Started at 35434 
01-11 05:51:53.542: W/System.err(2151): java.net.BindException: Address already in use 
01-11 05:51:53.542: W/System.err(2151):  at org.apache.harmony.luni.platform.OSNetworkSystem.bind(Native Method) 
01-11 05:51:53.542: W/System.err(2151):  at dalvik.system.BlockGuard$WrappedNetworkSystem.bind(BlockGuard.java:275) 
01-11 05:51:53.571: W/System.err(2151):  at org.apache.harmony.luni.net.PlainSocketImpl.bind(PlainSocketImpl.java:165) 
01-11 05:51:53.571: W/System.err(2151):  at java.net.ServerSocket.<init>(ServerSocket.java:123) 
01-11 05:51:53.592: W/System.err(2151):  at java.net.ServerSocket.<init>(ServerSocket.java:74) 
01-11 05:51:53.592: W/System.err(2151):  at com.whooznear.android.ServiceServer.serverThreadProc(ServiceServer.java:63) 
01-11 05:51:53.592: W/System.err(2151):  at com.whooznear.android.ServiceServer.access$0(ServiceServer.java:58) 
01-11 05:51:53.611: W/System.err(2151):  at com.whooznear.android.ServiceServer$1.run(ServiceServer.java:53) 
+0

Address alreay in use means that some other application is already using the port number。在运行应用程序之前关闭该应用程序,或者更改您的端口号。 POssibility是你自己的应用程序可能在后台运行,你没有注意到它。 – Acn 2012-01-11 07:38:04

+0

我对Andoid一无所知,但在“接受”之前,你需要一个'listen'。 – 2012-01-11 07:41:13

回答

1

创建的过程start()ServerSocket任务,然后创建在程序serverThreadProc()的相同端口上新增ServerSocket。在创建新的服务器套接字之前,您必须关闭旧的套接字。或者使用另一个端口。

相关问题