我正在使用Java套接字在两台机器之间进行通信。 因此,当服务器收到消息时,它会处理它并回复另一条消息。 我正在使用TCP协议。
我的问题是,假设网络速度很慢。然后在发送消息后,如果我调用套接字的InputStream.available()方法,我是否可以获得从服务器到套接字的实际字节数?
同样,InputStream.available()总是返回从服务器发送的完整字节数,即使消息非常大?我听说TCP有数据包限制,这会影响InputStream.available()吗?
答案 0 :(得分:1)
您几乎不会立即从服务器获得字节(您的客户端应用程序可以更快地检查输入流FAR,而不是任何网络可以传输数据,服务器可以处理和发送响应)。
不,您无法保证非零available()
调用将返回服务器响应的整个大小。引用javadoc:
返回可读取的字节数的估计值(或 从此输入流中跳过)而不会被下一个阻塞 调用此输入流的方法。下一次调用可能 是相同的线程或另一个线程。单个读取或跳过此操作 许多字节不会阻塞,但可能会读取或跳过更少的字节。
请注意,虽然InputStream的某些实现将返回 流中的总字节数,很多都不会。永远不会 正确使用此方法的返回值来分配缓冲区 旨在保存此流中的所有数据。
答案 1 :(得分:1)
服务器将数据发送到流并且客户端收到数据之间总是存在延迟。它可能更长或更短,具体取决于网络速度。此外,如果消息大小大于TCP数据包最大大小,则消息将被拆分为多个TCP数据包,在这种情况下,available()可能返回小于消息大小的值。