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

时间:2013-08-19 04:12:36

标签: java sockets tcp

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

  

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

     

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

答案 1 :(得分:1)

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