gpt4 book ai didi

java - SocketChannel 的 write() 方法在应该抛出异常时却没有抛出异常

转载 作者:行者123 更新时间:2023-12-01 14:24:49 26 4
gpt4 key购买 nike

我正在编写一个服务器来在客户端之间交换消息。需要解决的一个问题是当客户端关闭时如何释放 channel 。我所做的是启动一个监视线程,在该线程中监视所有客户端映射,并且如果在尝试 write() 时检测到异常,我会尝试删除() channel 。但是,关闭客户端后,监视器线程中的 write() 方法不会抛出异常,因此无用的 channel 永远不会被释放。有人知道为什么吗?

public class ServerMonitor extends Thread{
private Map<String, SocketChannel> allClients;
private Set set;
private Iterator it;
private Entry entry;
private SocketChannel channel;
private ByteBuffer buf;

public ServerMonitor(Map<String, SocketChannel> allClients) {
this.allClients = allClients;
buf = ByteBuffer.allocateDirect(10);
byte b = 0;
buf.put(b);
buf.flip();
}

public void run(){
while(true) {
if(!allClients.isEmpty()) {
set = allClients.entrySet();
it = set.iterator();
while(it.hasNext()) {
entry = (Entry) it.next();
channel = (SocketChannel) entry.getValue();
try{
channel.write(buf);
} catch(Exception e) {
allClients.remove(entry.getKey());
//set.remove(entry);
}
}
}
try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

最佳答案

写入 TCP 套接字会在本地缓冲并异步传输。因此,您不能依赖对等点关闭后的第一次写入失败。您可以依赖后续写入失败,但可能需要多次写入才能到达那里。

关于java - SocketChannel 的 write() 方法在应该抛出异常时却没有抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17235940/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com