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

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

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

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

expeditioner
2006-09-08 15:17
多谢您的回复。

请问是使用java.nio.channels.*吗?

如果是该用什么类处理流?

我以前用socket时是这样接收流的,

zipin=new ZipInputStream(incoming.getInputStream());

如果用SocketChannel怎么接收流?先谢了.

hqb732
2006-09-08 17:07
sadfsdaf

expeditioner
2006-09-12 08:33
我用java写的发送数据程序,使用Socket,接收程序用ServerSocket,经测试没有丢失数据现象。

而将发送程序换为PB时,接收程序接收的数据不完整,尾部数据丢失.

因为发送程序要求尽量使用PB,PB本身无此功能,是调用pslib21.dll实现的.这个文件版本好象很旧,我怀疑是这版本不兼容的问题。

现在我发现win2000下有一个ws2_32.dll文件,好象现在实现socket都是用这个库文件.

请问大家有没有这方面的资料?先谢了.

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

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

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

1,为什么阻塞就会丢包

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

clonalman
2014-04-25 05:16
什么年代的帖子??

TCP协议已经保证不丢包(堵塞丢了会重发),

丢包只说明socket的"粘包"、“半包”没处理好

[该贴被clonalman于2014-04-25 05:23修改过]

猜你喜欢