2014-02-26 150 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,所以你可以捕獲一個乾淨的退出。