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

Java 当数据实际通过套接字发送时?,java,sockets,tcp,Java,Sockets,Tcp,我使用Java套接字在两台机器之间进行通信。 因此,当服务器收到一条消息时,它会对其进行处理,并用另一条消息进行回复。 我使用的是TCP协议 我的问题是,假设网络速度很慢。然后,在发送消息之后,如果我调用套接字的InputStream.available()方法,我会得到从服务器到套接字的实际可用字节吗 另外,InputStream.available()是否总是返回从服务器发送的完整字节数,即使消息非常大?我听说TCP有一个数据包限制,这也会影响InputStream.available()?

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

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


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

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

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

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

注意,虽然InputStream的一些实现将返回 流中的总字节数,许多字节不会。从来都不是 更正以使用此方法的返回值分配缓冲区 用于保存此流中的所有数据


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

否。我无法模拟繁忙的网络,我不知道这种情况何时会发生。我还编辑了这个问题以询问一个相关的问题。我假设您指的是
InputStream.available()
,而不是
Socket.available()
,因为Java套接字API中没有这样的方法。这是正确的,还是您正在使用第三方库?可能相关。哦,对不起,InputStream.available()@Edwin Dalorzo,谢谢您的回复。我读过“在不阻塞的情况下从套接字读取可用内容”。那么,我们可以用什么方式说服务器响应已完成?谢谢您的回复。那么,确保消息完成的替代方法是什么呢?这取决于您实现的与服务器通信的协议。简单的做法是让服务器在邮件开头发送内容长度,以便您知道需要读取多少字节。非常感谢您的澄清。非常感谢您的澄清。