2013-08-19 43 views
0

我正在使用Java套接字在两台机器之间进行通信。 所以当服务器收到一条消息时,它会处理它并用另一条消息回复。 我正在使用TCP协议。当数据实际上通过套接字发送?

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

也是InputStream.available()总是返回从服务器发送的字节的全部数量,即使消息是非常大的?我听说TCP有一个数据包限制,所以会影响InputStream.available()吗?

+0

你试过了吗? – Undo

+0

不,我不能模拟繁忙的网络,我不知道这种情况何时会发生。另外我编辑了这个问题来问一个相关的问题。 – Harikrishnan

+0

我假设你的意思是'InputStream.available()'而不是'Socket.available()',因为Java Socket API中没有这样的方法。这是正确的,还是你正在使用一些第三方库? –

回答

1

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

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

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

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

+0

谢谢您的回复。那么确保信息完成的另一种方法是什么? – Harikrishnan

+1

这取决于您实现与服务器进行通信的协议。简单的做法是让服务器在消息的开头发送一个内容长度,以便知道需要读取的字节数。 – Aurand

+0

非常感谢您的澄清。 – Harikrishnan

1

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

+0

非常感谢您的澄清。 – Harikrishnan