我有一个带有以下代码的服务器线程:
public void run() {
try {
ServerSocket server;
EneaLog.printLog("Server is running.");
server = new ServerSocket(this.portnumber);
while (true) {
new EneaServerConnection(server.accept(), this.project,stopped).start();
if (stopped) {
EneaLog.printLog("Server safe-shutdown completed.");
EneaLog.printLog("Hi!");
server.close();
return;
}
}
} catch (IOException ex) {
Logger.getLogger(EneaServer.class.getName()).log(Level.SEVERE, null, ex);
project.getExceptionHandler().handler(ex);
}
}
和这样的关闭方法:
public void shutdown() {
EneaLog.printLog("Server shutdown NOW!");
stopped = true;
}
我希望关闭可以解锁正在等待 server.accept() 的线程,否则我必须在服务器关闭之前等待连接。
我无法在 shutdown() 中执行 server.close() 因为我必须向注册客户端发出服务器即将关闭的信号。
有任何想法吗?
我尝试设计我的代码,以便它可以通过中断“关闭”。这主要是因为Executor
Java并发包中的框架使用interrupt
取消正在运行的任务。此外,“关闭”任务不必知道被终止任务的任何内部情况。
但是,致电accept
不会响应中断unless it is 创建自ServerSocketChannel. http://java.sun.com/javase/6/docs/api/java/nio/channels/ServerSocketChannel.html#socket()使用创建的服务器ServerSocket
构造函数将忽略中断,我还没有找到重新配置它的方法。
如果无法更改创建服务器的代码,请安排另一个线程来调用close
在服务器套接字上。这也会在线程阻塞时引发异常accept
,无论使用什么方法创建服务器套接字。
事实证明,使用 SSL 时这确实是一个很大的痛苦。 JSSE 套接字不是从InterruptibleChannel
,并且不会响应线程上的简单中断。
我刚刚注意到这个问题说在不通知客户端的情况下无法关闭服务器。成功中断套接字会导致其关闭。
打电话给accept
这应该不是问题,因为如果服务器套接字在接受中被阻止,则客户端不会连接。这应该只是一个问题Socket
实例,代表当前连接。
如果这不满足通知要求,则返工以使用 NIOServerSocketChannel
在非阻塞模式下可能是必要的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)