您好我正在尝试实现一个简单的 Java NIO 服务器;它将 socketChannel 注册到选择器。因此,我希望听取客户的意见并发送一些回复。socketChannel注册到selector后,即使client(non NIO)发送了一些数据,Server也无法读取;但是,生成的密钥仍在迭代中。
详细视图:服务器端:
**First thread**:
公共无效运行(){而(真){
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(true);
serverSocketChannel.socket().bind(inetAdressOfServer);
SocketChannel clientChannel = serverSocketChannel.accept();
new Listener("").addSocketChannel(clientChannel);
}}
**Second Thread**:
static Selector selector = Selector.open();
public boolean addSocketChannel(SocketChannel clientChannel) {
SelectionKey key = clientSocketChannel.register(selector, selector.OP_READ|SelectionKey.OP_WRITE);
key.attach(new ChannelCallback(clientSocketChannel));
return key.isValid();
}
public void run() {
Set keysSet = selector.keys();
Iterator i = keysSet.iterator();
while (i.hasNext()) {
SelectionKey key = (SelectionKey) i.next();
}
if (key.isReadable()) {
//read and do something
}
}
Client Side:
Socket socket = new Socket(serverIP, serverPort);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeBytes(str + "\n");
注意:当在单线程中完成时,相同的程序可以工作,但是以上述方式实现时会导致它不听客户端。请帮我解决这个问题。