2012-03-18 159 views
1

我创建一个服务器客户端程序,客户端根据服务器的响应向服务器发送特定信息。 对于不断从多个客户端侦听,我有一个线程在服务器上不断侦听客户端请求。无论何时收到请求,我启动另一个线程并发送该套接字运行并开始监听其他客户端的请求。在java中杀死线程

这里是代码连续听

while(true){ 
    //serverListener is a ServerSocket object 
    clientSocket = serverListener.accept();//Waiting for any client request 

    //New thread started when request is received from any client 
    Thread thread =new Thread(new serverThread(clientSocket), "ClientThread"); 
    thread.start(); 
} 

现在我的问题是,如何才能停止服务器。我知道在while循环中使用boo lean变量,然后更改值的一种替代方法,但问题是当线程正在等待获取任何连接时,更改布尔变量的值也不会停止服务器。

有什么办法可以解决这个问题。

+0

1级的解决方案,我发现是使用服务器套接字超时,然后使用布尔变量检查服务器是否停止。 – Zlatan 2012-03-18 18:32:48

回答

0

ServerSocket#setSoTimeout()可能会引起您的兴趣,如果达到超时,它将放弃接受。注意捕捉SocketTimeoutException。

+0

超时可以是解决方案之一,但我不想阻止它听从 – Zlatan 2012-03-18 18:26:39

+1

您可以将accept()放入循环中。超时检查是否请求停止。如果不是,再次接受()。 – PeterMmm 2012-03-18 18:34:51

3

通常serverListener(我认为其实是一个ServerSocket什么的)被另一个线程关闭。这将在accept()中生成java.net.SocketException,这将终止循环和线程。

final ServerSocket serverSocket = new ServerSocket(8000); 
new Thread(new Runnable() { 
    public void run() { 
     while (true) { 
      try { 
       serverSocket.accept(); 
      } catch (IOException e) { 
       return; 
      } 
     } 
    } 
}).start(); 
Thread.sleep(10000); 
serverSocket.close(); 
+0

我已经尝试过这种方法,IO异常仍在服务器上运行。 – Zlatan 2012-03-18 18:10:14

+0

@Meherzad“仍服务器正在运行”是什么意思?关闭后,套接字不应绑定到端口。你的意思是线程仍在运行?该程序不关机? – Gray 2012-03-18 18:13:37

+0

尝试设置setDaemon(true)。在启动之前在服务器接受线程上调用它。客户端 - 服务器线程也将成为守护进程线程。服务器应用程序应该退出。 – 2012-03-18 18:18:52

0
volatile boolean finishFlag = false; 

while(true){ 

      clientSocket = serverListener.accept();//Waiting for any client request 

      if (finishFlag) 
       break; 

      //New thread started when request is received from any client 
      Thread thread =new Thread(new serverThread(clientSocket), "ClientThread"); 
      thread.start(); 
} 

编辑:

打断听众,你应该从外部阻止这个线程,然后接受()将抛出IOException异常

try { 
     while (true) { 
     Socket connection = server.accept(); 

     try {  
      // any work here  
      connection.close(); 
     } 
     catch (IOException ex) { 
     // maybe the client broke the connection early. 
     } 

     finally { 
     // Guarantee that sockets are closed when complete. 
     try { 
      if (connection != null) connection.close(); 
     } 
     catch (IOException ex) {} 
    }  
    }  
    catch (IOException ex) { 
    System.err.println(ex); 
    } 
+0

它继续等待accept(),直到接收到新客户端的客户端请求时才会进入下一行。我已经尝试过这种情况,并在问题中提到了这一点。 – Zlatan 2012-03-18 18:13:11