gpt4 book ai didi

Java NIO SocketChannel写法问题

转载 作者:行者123 更新时间:2023-11-30 09:55:40 24 4
gpt4 key购买 nike

我正在使用 Java NIO 的 SocketChannel 来编写:int n = socketChannel.write(byteBuffer); 大多数时候,数据是分成一两个部分发送的;即,如果一次尝试无法发送数据,则重试剩余数据。

这里的问题是,有时候,一次尝试没有完全发送数据,尝试多次发送其余数据时,即使尝试了几次,也没有一个字符被写入 channel ,最后在一段时间后发送剩余数据。此数据可能不会很大,可能约为 2000 个字符。

这种行为的原因可能是什么? RAM、操作系统等外部因素是否会导致障碍?

请帮我解决这个问题。如果需要任何其他信息,请告诉我。谢谢

编辑:

在 NIO SocketChannel 中是否有一种方法可以在实际写入之前检查 channel 是否可以提供要写入的数据。这里的意图是,在尝试写入完整数据后,如果一些数据还没有写入 channel ,在写入剩余数据之前,我们是否可以检查 SocketChannel 是否可以再接收数据;因此,负责写入此数据的线程可以等待或做其他事情,而不是多次尝试无果而终。

最佳答案

TCP/IP 是一种流媒体协议(protocol)。无法保证您发送的数据在任何级别的任何地方都不会被分解成单字节段,或者在您编写时不会被分解成单字节段和单字节段之间的任何内容。

你的期望是错误的。

关于您的编辑,当套接字发送缓冲区填满时,write() 将返回零。当你得到它时,为 OP_WRITE 注册 channel 并停止写循环。当你得到 OP_WRITE 时,注销它(非常重要)并继续写入。如果 write() 再次返回零,则重复。

关于Java NIO SocketChannel写法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2719482/

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