gpt4 book ai didi

Java AsynchronousSocketChannel 读操作

转载 作者:行者123 更新时间:2023-12-01 11:31:20 24 4
gpt4 key购买 nike

我正在使用java AsynchronousSocketChannel来 self 的项目中的 nio2。我也在 ubuntu 14.04 上使用 oracle jdk 1.7.0_80。

我的项目是一个处理二进制数据的服务器。代码在CompletionHandler的completed方法中递归调用读操作匿名类,如下所示:

private final CompletionHandler<Integer,AsynchronousSocketChannel> readHandler=new CompletionHandler<Integer,AsynchronousSocketChannel>(){

@Override
public void completed(Integer result,AsynchronousSocketChannel attachment) {
if(result<0){
attachment.close();
return;
}
attachment.read(swap, attachment, this);
}
}

其中变量交换是 ByteBuffer 实例。

显然,一切都很顺利。但是,有一个数据包的总大小为3832字节,当服务器接收到整个数据包时,没有分段,没有问题。然而,有时该数据包被分成两个或多个部分(TCP 段)。例如:第一段的大小为2896字节,第二段的大小为936字节。

最后一段没有标题,这破坏了我的算法。我想知道,有没有办法让 API 仅在读取整个数据包后调用“完成”方法?

我增加了 SO_RCVBUF到64K,但不起作用。

最佳答案

I would like know, is there a way to do the API calls the "completed" method only after reading the whole packet?

不,没有办法做到这一点。

TCP 协议(protocol)可以将字节流分解为任意大小的数据包。您在 TCP 之上使用的应用程序级协议(protocol)不得依赖于始终完全在一个 TCP 数据包中发送的消息。

您必须设计应用程序级协议(protocol),使其能够处理以任意大小的数据包形式到达的消息。

实现此目的的一种常见方法是在应用程序级消息中添加长度字段前缀。例如,应用程序级消息由 4 个字节的字段组成,其中包含消息其余部分的长度。当您接收消息时,您首先会收到长度,然后您应该继续接收,直到收到那么多字节,然后您可以将其组装成应用程序级消息。

AsynchronousSocketChannel API 无法自动为您重新组装应用程序级消息,因为它不了解有关您的应用程序级协议(protocol)的任何信息。

关于Java AsynchronousSocketChannel 读操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30360640/

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