我有一个服务器线程与此代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
和这样的关机方法:
public void shutdown() {
EneaLog.printLog("Server shutdown NOW!");
stopped = true;
}
Run Code Online (Sandbox Code Playgroud)
我希望关闭可以解除在server.accept()上等待的线程,否则我必须在服务器关闭之前等待连接.
我不能在shutdown()中执行server.close()因为我必须向注册客户端发信号通知服务器正在关闭.
有任何想法吗?
我尝试设计我的代码,以便它可以通过中断“关闭”。主要是因为ExecutorJava并发包中的框架使用了interrupt取消正在运行的任务。此外,“关闭”任务不必知道被终止任务的任何内部情况。
然而,对 的调用accept不会响应中断,除非它是从ServerSocketChannel. 使用构造函数创建的服务器ServerSocket将忽略中断,并且我还没有找到重新配置它的方法。
如果无法更改创建服务器的代码,请安排另一个线程来调用close服务器套接字。accept无论用于创建服务器套接字的方法如何,这也会在阻塞的线程中引发异常。
事实证明,使用 SSL 时这确实是一个很大的痛苦。JSSE 套接字不是从 中创建的InterruptibleChannel,并且不会响应线程上的简单中断。
我刚刚注意到这个问题说在不通知客户端的情况下无法关闭服务器。成功中断套接字会导致其关闭。
对此的调用accept应该不是问题,因为如果服务器套接字在接受中被阻止,则客户端不会连接。Socket这应该只是代表当前连接的实例的问题。
ServerSocketChannel如果这不能满足通知要求,则可能需要重新设计以非阻塞模式使用 NIO 。
| 归档时间: |
|
| 查看次数: |
7471 次 |
| 最近记录: |