繁体   English   中英

当数据实际通过套接字发送时?

[英]When the data is actually sent through socket?

我正在使用Java套接字在两台机器之间进行通信。 因此,当服务器收到消息时,它会处理它并回复另一条消息。 我正在使用TCP协议。

我的问题是,假设网络是否很慢。 然后在发送消息后立即,如果我调用套接字的InputStream.available()方法,我是否可以获得从服务器到套接字的实际字节数?

另外,InputStream.available()总是返回从服务器发送的完整字节数,即使消息非常大? 我听说TCP有数据包限制,这会影响InputStream.available()吗?

您几乎不会立即从服务器获得字节(您的客户端应用程序可以更快地检查输入流FAR,而不是任何网络可以传输数据,服务器可以处理和发送响应)。

不,您无法保证非零的available()调用将返回服务器响应的整个大小。 引用javadoc:

返回可以从此输入流中读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。下一次调用可能是同一个线程或另一个线程。 单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。

请注意,虽然InputStream的某些实现将返回流中的总字节数,但许多实现不会。 使用此方法的返回值来分配用于保存此流中所有数据的缓冲区绝对不正确。

服务器发送数据到流和客户端接收数据之间总是存在延迟。 它可能更长或更短,具体取决于网络速度。 此外,如果消息大小大于TCP数据包最大大小,则消息将被分成几个TCP数据包,在这种情况下,available()可能返回小于消息大小的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM