0

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

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

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

4

2 回答 2

1

您几乎永远不会从服务器立即获得可用的字节(您的客户端应用程序检查输入流的速度比几乎任何网络传输数据和服务器可以处理和发送响应的速度都要快)。

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

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

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

于 2013-08-19T04:41:20.033 回答
1

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

于 2013-08-19T04:51:27.123 回答