Java nio:客户端已断开连接,服务器未被阻止。selector.select()始终返回1
当我学习NiO时,Java出现了bug。当客户端断开连接时,服务器不会被阻止。selector.select()始终返回1,这是有意义的。套接字通道始终是可读的,Java nio:客户端已断开连接,服务器未被阻止。selector.select()始终返回1,java,socket.io,Java,Socket.io,当我学习NiO时,Java出现了bug。当客户端断开连接时,服务器不会被阻止。selector.select()始终返回1,这是有意义的。套接字通道始终是可读的,read始终返回EOF 从频道读取EOF后,需要将其从选择器中删除。这是我的代码 包com.socket.Server; 导入java.io.IOException; 导入java.net.InetSocketAddress; 导入java.net.ServerSocket; 导入java.net.Socket; 导入java.nio
read
始终返回EOF
从频道读取EOF后,需要将其从选择器中删除。这是我的代码
包com.socket.Server;
导入java.io.IOException;
导入java.net.InetSocketAddress;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.nio.ByteBuffer;
导入java.nio.channels.SelectionKey;
导入java.nio.channels.Selector;
导入java.nio.channels.ServerSocketChannel;
导入java.nio.channels.SocketChannel;
导入java.nio.charset.charset;
导入java.util.HashMap;
导入java.util.Map;
导入java.util.Set;
公共类ImSocketServer{
专用int端口=8888;
私有字符集cs=Charset.forName(“gbk”);
私有静态ByteBuffer sBuffer=ByteBuffer.allocate(1024);
私有静态ByteBuffer rBuffer=ByteBuffer.allocate(1024);
私有映射clientsMap=newhashmap();
专用静态选择器;
公共ImSocketServer(int端口){
this.port=端口;
试试{
init();
}捕获(例外e){
e、 printStackTrace();
}
}
私有void init()引发IOException{
ServerSocketChannel ServerSocketChannel=ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
ServerSocket ServerSocket=serverSocketChannel.socket();
bind(新的InetSocketAddress(端口));
选择器=selector.open();
serverSocketChannel.register(选择器,SelectionKey.OP_ACCEPT);
System.out.println(“服务器在端口上启动:“+端口”);
}
私有void listen(){
虽然(正确){
试试{
System.out.println(selector.select());
设置selectionKeys=selector.selectedKeys();
对于(SelectionKey:selectionKeys){
试一试{
手柄(钥匙);
}
捕获(例外e){
System.out.println(“挂了");
}
}
selectionKeys.clear();
selector.selectedKeys().clear();
}捕获(例外e){
e、 printStackTrace();
打破
}
}
}
私有无效句柄(SelectionKey SelectionKey)引发IOException{
serversocketchannelserver=null;
SocketChannel客户端=null;
字符串receiveText=null;
整数计数=0;
如果(selectionKey.isAcceptable()){
server=(ServerSocketChannel)selectionKey.channel();
client=server.accept();
client.configureBlocking(false);
客户机。寄存器(选择器,SelectionKey.OP_READ);
}如果(selectionKey.isReadable()){
client=(SocketChannel)selectionKey.channel();
rBuffer.clear();
count=client.read(rBuffer);
如果(计数>0){
rBuffer.flip();
receiveText=String.valueOf(cs.decode(rBuffer.array());
System.out.println(client.toString()+“:”+receiveText);
发送(客户、接收文本);
client=(SocketChannel)selectionKey.channel();
客户机。寄存器(选择器,SelectionKey.OP_READ);
}
}
}
私有void分派(SocketChannel客户端,字符串信息)引发IOException{
sockets=client.Socket();
字符串名称=“[”+s.getInetAddress().toString().substring(1)+:“+Integer.toHexString(client.hashCode())+”];
如果(!clientsMap.isEmpty()){
对于(Map.Entry:clientsMap.entrySet()){
SocketChannel temp=entry.getValue();
如果(!client.equals(temp)){
sBuffer.clear();
sBuffer.put((name+”:“+info.getBytes());
sBuffer.flip();
临时写入(sBuffer);
}
}
}
客户映射放置(名称、客户);
}
公共静态void main(字符串[]args)引发IOException{
ImSocketServer服务器=新的ImSocketServer(7777);
server.listen();
}
}
我应该如何避免它