您不能简单地停止服务器。关闭过程可能需要一段时间才能进行清理,因为您需要确保一致性。
想象一个数据库服务器,如果您在它执行事务时简单地关闭它,您可能会使其数据不一致。这就是为什么通常需要一段时间才能关闭服务器。
- 您必须首先停止接受服务器中的新连接。
- 然后你可以等待当前工作线程完成他们的工作,然后关闭服务器并正式关闭。
- 或者您强制工作线程关闭它们与
客户端的连接(可能按照建议使用某种
标志)。这可能意味着需要进行一些清理以使数据保持一致,例如恢复事务或您在文件或内存中所做的任何类型的更改。
据我了解,在服务器端关闭与客户端的连接应该会导致客户端在他们身边获得 EOF。
[编辑-1]
我对这个问题进行了一些研究,只是因为我有一段时间没有使用套接字,而且我发现这个问题很有趣。我认为正如其他人已经很好指出的那样,唯一的选择是关闭套接字,根据得到的 Javadocs 将自动关闭输入和输出流/
如果线程有可能不是 IO-blocked,而是处于等待状态或休眠状态,我认为仍然建议为给定套接字的相应工作线程发出 Thread.interrupt();因为不能确定每个线程的状态阻塞。
public static class IOServerWorker implements Runnable{
private Socket socket;
public IOServerWorker(Socket socket){
this.socket = socket;
}
@Override
public void run() {
String line = null;
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while( (line = reader.readLine())!=null){
System.out.println(line);
}
reader.close();
}catch(IOException e){
//TODO: do cleanup here
//TODO: log | wrap | rethrow exception
}
}
}