gpt4 book ai didi

java - 异步NIO : Same client sending multiple messages to Server

转载 作者:行者123 更新时间:2023-12-01 18:58:54 25 4
gpt4 key购买 nike

关于Java NIO2。

假设我们有以下内容来监听客户端请求...

asyncServerSocketChannel.accept(null, new CompletionHandler <AsynchronousSocketChannel, Object>() {
@Override
public void completed(final AsynchronousSocketChannel asyncSocketChannel, Object attachment) {
// Put the execution of the Completeion handler on another thread so that
// we don't block another channel being accepted.
executer.submit(new Runnable() {
public void run() {
handle(asyncSocketChannel);
}
});

// call another.
asyncServerSocketChannel.accept(null, this);
}

@Override
public void failed(Throwable exc, Object attachment) {
// TODO Auto-generated method stub
}
});

此代码将接受一个客户端连接并对其进行处理,然后接受另一个。为了与服务器通信,客户端打开 AsyncSocketChannel 并触发消息。然后调用完成处理程序 Completed() 方法。

但是,这意味着如果客户端想要在同一个 AsyncSocket 实例上发送另一条消息,则不能。

它必须创建另一个 AsycnSocket 实例 - 我相信这意味着另一个 TCP 连接 - 这会影响性能。

有什么办法可以解决这个问题吗?

或者换句话说,有什么想法如何使同一个 asyncSocketChannel 接收多个 CompleteionHandler Completed() 事件吗?

编辑:我的处理代码是这样的...

public void handle(AsynchronousSocketChannel asyncSocketChannel) {
ByteBuffer readBuffer = ByteBuffer.allocate(100);
try {
// read a message from the client, timeout after 10 seconds
Future<Integer> futureReadResult = asyncSocketChannel.read(readBuffer);
futureReadResult.get(10, TimeUnit.SECONDS);
String receivedMessage = new String(readBuffer.array());

// some logic based on the message here...

// after the logic is a return message to client
ByteBuffer returnMessage = ByteBuffer.wrap((RESPONSE_FINISHED_REQUEST + " " + client
+ ", " + RESPONSE_COUNTER_EQUALS + value).getBytes());
Future<Integer> futureWriteResult = asyncSocketChannel.write(returnMessage);
futureWriteResult.get(10, TimeUnit.SECONDS);
} ...

这就是我的服务器从异步 channel 读取消息并返回答案。客户端会阻塞直到得到答案。但这没关系。我不在乎客户端是否阻塞。

完成后,客户端尝试在同一异步 channel 上发送另一条消息,但它不起作用。

最佳答案

有 2 个连接阶段和 2 种不同类型的完成处理程序。第一阶段是处理连接请求,这就是您所编程的(顺便说一句,正如乔纳斯所说,不需要使用另一个执行器)。第二阶段(可以重复多次)是发出 I/O 请求并处理请求完成。为此,您必须提供一个内存缓冲区来保存要读取或写入的数据,并且您没有为此显示任何代码。当您执行第二阶段时,您会发现不存在您所写的问题:“如果客户端想要在同一个 AsyncSocket 实例上发送另一条消息,则它不能”。

NIO2 的一个问题是,一方面,程序员必须避免在同一 channel 上进行多个相同类型的异步操作(接受、读取或写入)(否则会发生错误),另一方面,程序员必须避免在处理程序中阻塞等待。这个问题在 df4j actor framework 的 df4j-nio2 子项目中得到解决,其中 AsyncServerSocketChannel 和 AsyncSocketChannel 均表示为参与者。 (df4j是我开发的。)

关于java - 异步NIO : Same client sending multiple messages to Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13017825/

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