Networking 使用TCP的非阻塞套接字

Networking 使用TCP的非阻塞套接字,networking,tcp,ip,nonblocking,packet,Networking,Tcp,Ip,Nonblocking,Packet,我正在使用Java非阻塞套接字和TCP编写一个程序。我知道TCP是一种流协议,但底层IP协议使用数据包。当我调用SocketChannel.read(ByteBuffer dst)时,我是否总能获得IP数据包的全部内容?或者它可能在一个数据包中间的任何位置结束? 这很重要,因为我试图通过通道发送单独的消息,每条消息都足够小,可以在单个IP数据包中发送,而不会出现碎片。如果通过在接收方调用read()始终可以获得完整的消息,那就太酷了,否则我必须实现一些方法来重新组装消息 编辑:假设在发送方,消息

我正在使用Java非阻塞套接字和TCP编写一个程序。我知道TCP是一种流协议,但底层IP协议使用数据包。当我调用SocketChannel.read(ByteBuffer dst)时,我是否总能获得IP数据包的全部内容?或者它可能在一个数据包中间的任何位置结束?

这很重要,因为我试图通过通道发送单独的消息,每条消息都足够小,可以在单个IP数据包中发送,而不会出现碎片。如果通过在接收方调用read()始终可以获得完整的消息,那就太酷了,否则我必须实现一些方法来重新组装消息

编辑:假设在发送方,消息以很长的间隔(比如1秒)发送,因此它们不会在一个IP数据包中分组。在接收方,用于调用read(ByteBuffer dst)的缓冲区足够大,可以容纳任何消息。

来自文档:

A socket channel in non-blocking mode, for example, cannot read 
any more bytes than are immediately available from the socket's input buffer;
因此,如果目标缓冲区足够大,您应该能够使用套接字输入缓冲区中的全部数据。

来自文档:

A socket channel in non-blocking mode, for example, cannot read 
any more bytes than are immediately available from the socket's input buffer;

因此,如果目标缓冲区足够大,则应该能够使用套接字输入缓冲区中的全部数据。

套接字API不保证send()和recv()调用与TCP套接字的数据报相关。在发送端,事情可能已经重新组合,例如,系统可能延迟发送一个数据报,以查看应用程序是否有更多数据;在接收端,读取调用可以从多个数据报检索数据,或者如果调用方指定的大小是需要断开数据包的,则可以从部分数据报检索数据


注意,TCP套接字API假定您有字节流,而不是数据包序列。您需要确保一直调用read(),直到有足够的字节用于请求。

套接字API不能保证send()和recv()调用与TCP套接字的数据报相关。在发送端,事情可能已经重新组合,例如,系统可能延迟发送一个数据报,以查看应用程序是否有更多数据;在接收端,读取调用可以从多个数据报检索数据,或者如果调用方指定的大小是需要断开数据包的,则可以从部分数据报检索数据


注意,TCP套接字API假定您有字节流,而不是数据包序列。您需要确保一直调用read(),直到有足够的字节用于请求。

TCP是一个字节流。每次读取都将收到1到您提供的缓冲区大小的最大值以及此时可读取的字节数

TCP对您的消息概念一无所知。客户端每次发送都可能导致另一端需要0次或更多读取。零或更多,因为您可能会得到一次读取,该读取返回多条“消息”

您应该始终编写您的读取代码,以便它能够处理您的消息框架,并重新组装部分消息或拆分多个消息

您可能会发现,如果您不考虑这种复杂性,那么您的代码在大多数情况下似乎都是“工作”的,不要依赖于此。一旦你在繁忙的网络上或通过互联网运行,或者一旦你增加了邮件的大小,你就会被你的坏代码咬到


我在这里讨论了TCP消息框架:这里,虽然它是C++实现的,所以它可能对您可能感兴趣,但

< P> TCP是字节流。每次读取都将收到1到您提供的缓冲区大小的最大值以及此时可读取的字节数

TCP对您的消息概念一无所知。客户端每次发送都可能导致另一端需要0次或更多读取。零或更多,因为您可能会得到一次读取,该读取返回多条“消息”

您应该始终编写您的读取代码,以便它能够处理您的消息框架,并重新组装部分消息或拆分多个消息

您可能会发现,如果您不考虑这种复杂性,那么您的代码在大多数情况下似乎都是“工作”的,不要依赖于此。一旦你在繁忙的网络上或通过互联网运行,或者一旦你增加了邮件的大小,你就会被你的坏代码咬到

<>我在这里讨论了TCP消息框架:这里是:尽管是C++实现,所以它可能对你有兴趣,也可能不感兴趣。