为什么使用Socket接收时丢失数据?

使用socket,TCP协议,服务器端接收数据时,如果数据超过600KB,就只能接收前部分,会丢失后面部分数据,如果客户端将数据分成若干小份,分次发送则会提高成功率,但如果数据量再大一些,又会丢失,每次发送的数据量越小成功率越高,但发送的次数过多或总数据量再大一些就可能丢失,这是什么原因?需要设置缓存吗?谢谢

用setReceiveBufferSize设置了65536,虽然成功接收的数据多了一些但还是失败,又丢失了最后面的一部分数据。

使用NIO Socket, 普通Socket是堵塞性质的,发生堵塞就有可能丢包。

多谢您的回复。
请问是使用java.nio.channels.*吗?
如果是该用什么类处理流?
我以前用socket时是这样接收流的,
zipin=new ZipInputStream(incoming.getInputStream());
如果用SocketChannel怎么接收流?先谢了.

sadfsdaf

我用java写的发送数据程序,使用Socket,接收程序用ServerSocket,经测试没有丢失数据现象。
而将发送程序换为PB时,接收程序接收的数据不完整,尾部数据丢失.
因为发送程序要求尽量使用PB,PB本身无此功能,是调用pslib21.dll实现的.这个文件版本好象很旧,我怀疑是这版本不兼容的问题。
现在我发现win2000下有一个ws2_32.dll文件,好象现在实现socket都是用这个库文件.
请问大家有没有这方面的资料?先谢了.

2006-09-08 12:18 "@banq"的内容
使用NIO Socket, 普通Socket是堵塞性质的,发生堵塞就有可能丢包。 ...

在NIO中的Selector中,如果用一个Selector管理多个通道。那有没有可能出现系统由于来不及处理数据而导致数据丢失的问题。

2006-09-08 12:18 "@banq"的内容
使用NIO Socket, 普通Socket是堵塞性质的,发生堵塞就有可能丢包。 ...

1,为什么阻塞就会丢包
2,使用Selector处理多个通道的时候,也有可能会出现系统因为处理不及,导致有的数据丢失啊。selector.select这个方法是阻塞的啊。

什么年代的帖子??
TCP协议已经保证不丢包(堵塞丢了会重发),
丢包只说明socket的"粘包"、“半包”没处理好
[该贴被clonalman于2014-04-25 05:23修改过]