2010-05-10 117 views
8

下面的代码是在我的应用程序服务器代码:的Java停止服务器线程

private int serverPort; 

private Thread serverThread = null; 

public void networkListen(int port){ 

    serverPort = port; 

    if (serverThread == null){ 
     Runnable serverRunnable = new ServerRunnable(); 
     serverThread = new Thread(serverRunnable); 
     serverThread.start(); 
    } else { 

    } 
} 

public class ServerRunnable implements Runnable { 

    public void run(){ 

     try { 

      //networkConnected = false; 
      //netMessage = "Listening for Connection"; 
      //networkMessage = new NetworkMessage(networkConnected, netMessage); 
      //setChanged(); 
      //notifyObservers(networkMessage); 

      ServerSocket serverSocket = new ServerSocket(serverPort, backlog); 

      commSocket = serverSocket.accept(); 

      serverSocket.close(); 
      serverSocket = null; 

      //networkConnected = true; 
      //netMessage = "Connected: " + commSocket.getInetAddress().getHostAddress() + ":" + 
        //commSocket.getPort(); 
      //networkMessage = new NetworkMessage(networkConnected, netMessage); 
      //setChanged(); 
      //notifyObservers(networkMessage); 

     } catch (IOException e){ 

      //networkConnected = false; 
      //netMessage = "ServerRunnable Network Unavailable"; 
      //System.out.println(e.getMessage()); 
      //networkMessage = new NetworkMessage(networkConnected, netMessage); 
      //setChanged(); 
      //notifyObservers(networkMessage); 
     } 
    } 
} 

代码排序的工作,即如果IM尝试一条直线连接两端的交流和更新。

问题是,即时通讯侦听连接,如果我想退出监听然后服务器线程继续运行,并导致问题。

我知道我不应该在一个线程上使用.stop(),所以我想知道在解决这个问题时应该看起来像什么?

编辑:注释掉不需要的代码。

回答

12

从外部线程关闭服务器套接字。根据关于Serversocket.close()的文档,阻塞接受将会抛出一个SocketException,并且你可以关闭你的线程。

6

初始化ServerSocket后,请使用setSoTimeout。将accept纳入循环,捕获超时。根据是否要继续,从循环中断开并从run返回。

+0

非常感谢你“从循环中解脱” - 这是关键! – Kirzilla 2011-11-02 21:23:19