2014-02-26 149 views
0

我有一个程序启动一个被动服务器,该服务器为服务器套接字的每个连接生成一个连接处理程序。我想找到一个雄辩的方法来关闭服务器套接字并释放端口。目前,我不知道如何中断Socket.accept方法。我一直在使用同步方法在另一个线程中设置标志,但是Socket.accpet阻塞,直到建立连接。Java线程,从主JFrame GUI关闭服务器线程

我被动服务器代码

package NetSecConsole; 

import java.io.*; 
import java.net.*; 
import javax.swing.SwingUtilities; 


public class PassiveServer implements Runnable 
{ 
    Thread runner; 
    int port = 20000; 
    MainFrame mainFrame; 
    ServerSocket s = null; 

    public PassiveServer(MainFrame mf, int hostPort) 
    { 
     mainFrame = mf; 
     port = hostPort; 
     try 
     { 
      s = new ServerSocket(hostPort); 
     } 
     catch (Exception e) 
     { 
      newStatus("Server [Constructor]: Could not open server socket! " + e); 
     } 
    } 

    public void start() 
    { 
     if (runner == null) 
     { 
      runner = new Thread(this); 
      runner.start(); 
     } 
    } 

    @Override 
    public void run() 
    { 
     try 
     { 
      int connCount = 1; 
      for (;;) 
      { 
       // Sit and wait for a connection 
       newStatus("Server [run]: Waiting for connection to port " + Integer.toString(port) + "..."); 
       Socket incomingConnection = s.accept(); 

       // Pass the connection off to a connection handler thread 
       newStatus("Server [run]: Got connection on port " + Integer.toString(port)); 
       final ConnectionHandler conHand = new ConnectionHandler(mainFrame, incomingConnection, connCount); 

       // Start the connection handler, then continue; 
       conHand.start(); 
       connCount++; 
      } 
     } 
     catch (IOException e) 
     { 
      newStatus("Server [run]: IOException: " + e); 
     } 
    } 

    public final void newStatus(final String arg) 
    { 
     Runnable sendMsg = new Runnable() 
     { 
      @Override 
      public void run() 
      { 
        mainFrame.newStatusLine(arg); 
      } 
     }; 
     SwingUtilities.invokeLater(sendMsg); 
    } 

} 

回答

1

如果您不想通过关闭侦听套接字(这是非常好的IME)来强制执行异常,请设置一个易失性布尔“关闭”标志,该标志在每次accept()返回后都会被检查。然后通过打开本地主机客户端连接来使accept()调用返回。

+0

这工作很好。谢谢! – KDecker

0

你可以调用close()上的ServerSocket。待处理的接受调用会抛出一个SocketException,所以你可以捕获一个干净的退出。