gpt4 book ai didi

java - 使用 NIO 选择器从客户端向服务器发送自定义消息

转载 作者:行者123 更新时间:2023-12-01 10:34:38 25 4
gpt4 key购买 nike

正如标题所示,我坚持正确使用选择器。我想到的过程是,首先当将此客户端作为线程运行时,它将连接到服务器,等待确认(CONNACK),然后继续。到目前为止一切顺利,我收到了成功的消息!服务器设置为接受连接后读取。

while (iterator.hasNext()) {
final SelectionKey key = (SelectionKey) iterator.next();

iterator.remove();

try (SocketChannel keySocketChannel = (SocketChannel) key.channel()) {

//attempt connection
if (key.isConnectable()) {
System.out.print("Connecting");

if (keySocketChannel.isConnectionPending()) {
keySocketChannel.finishConnect();
}

while (keySocketChannel.read(buffer) != -1) {
buffer.flip();

charBuffer = decoder.decode(buffer);
System.out.print(".");

if (buffer.hasRemaining()) {
buffer.compact();
} else {
buffer.clear();
}
if (charBuffer.toString().equals(MessageType.CONNACK.getName())) {
System.out.println("SUCCESS!");

//At this point, it makes sense that the next operation
//is a write.
key.interestOps(SelectionKey.OP_WRITE);
break;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
}
System.out.println("SUCCESS!");
key.interestOps(SelectionKey.OP_WRITE);
} else if (key.isConnectable()) {
System.out.println("connectable");
} else if (key.isWritable()) {
System.out.println("write key");
write(key, socketChannel);
} else if (key.isReadable()) {
System.out.println("read key");
}
System.out.println("oops");
} catch (IOException e) {
e.printStackTrace();
}
}

但是问题是当我调用发布方法时。我打算做的是将请求放入同步队列中。然后在 write 方法中(当 key.isWritable() 时)它检查队列,如果发现任何内容,则将其发送到服务器。

发布

 @Override
public void publish(String message) {
//create publish request
final Request request = new Request(this.topic, message, MessageType.PUBLISH);

System.out.println("Adding request to queue..");
synchronized (this.dataQueue) {
dataQueue.add(request);
}
this.selector.wakeup();
}

问题是它永远不会到达 key.isWritable() (因此,打印“write key”)。可能是什么问题?

最佳答案

有东西要写的时候就写,然后检查返回值。 OP_WRITE 仅应在 write() 返回零的情况下使用。这里有很多关于这个问题的答案,其中很多是我自己写的。

关于java - 使用 NIO 选择器从客户端向服务器发送自定义消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34843054/

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