我有一个程序启动一个被动服务器,为每个到服务器套接字的连接生成一个连接处理程序。我想找到一种 Eloquent 方法来关闭服务器套接字并释放端口。目前,我不确定如何中断 Socket.accept 方法。我一直在使用同步方法在另一个线程中设置标志,但是 Socket.accpet 会阻塞,直到建立连接。
我的被动服务器代码
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);
}
}
最佳答案
如果您不想通过关闭监听套接字来强制异常(这是完美的 IME),则设置一个 volatile boolean “关闭”标志,该标志在每次 accept() 返回后进行检查。然后通过打开本地主机客户端连接使accept() 调用返回。
关于Java 线程,从主 JFrame GUI 关闭服务器线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22049724/