首页 新闻 会员 周边 捐助

关于TCP通信问题。一次接收了多条数据?如何一条一条接收?

0
悬赏园豆:5 [已解决问题] 解决于 2015-11-05 09:29

服务器端向客户端发送数据,数据是从数据库中查询出来的结果集。想一条一条发送,但是客户端测试接收的时候有时候是两条数据或者几条数据合并一次接受到的。
服务器端: while(sd.Read())
{
//XXX...
sServer.Send(XXXX);
}
客户端线程:while(true)
{
sClient.Receive(XXX);//这里读取到buffer中就可能有几条合并数据
}
是写入或者读取数据是从缓冲区的原因么?

c#
小书丶的主页 小书丶 | 初学一级 | 园豆:154
提问于:2015-11-03 15:06
< >
分享
最佳答案
0

Socket 通讯必须要进行 命令/数据 完整性判定,

Socket 传输数据有几种情况:比如循环发送:"1234567890" 这段消息(数据)

  1.接收到完整消息 "1234567890"

  2.接收到一半消息 "1234"

  3.接收到另一半消息  "567890"

  4.接收到完整+一半消息 "12345678901234"

所以你需要加一个消息结束标记, 完整消息直接执行,不完整消息缓存等待下一段消息然后和前一段拼接在验证是否是完整消息,这样一直循环下去

收获园豆:5
jio92 | 小虾三级 |园豆:1064 | 2015-11-04 10:56

恩恩 谢谢回答。已经解决了。采用的加包头的方法,包含数据长度,结束符的话怕和内容重复。需要转意的话感觉略麻烦,但是想用的方法是发送定长或者增加包头,后来还是用了增加包头。

小书丶 | 园豆:154 (初学一级) | 2015-11-05 09:28
其他回答(1)
0

有两种解决方案。

一种是Socket 短连接,就是说你连接上,数据接收完就断开。

然后下一次发送数据的时候,你再连上,再接收完就断开。

另一种就是处理 粘包

需要格局 | 园豆:2145 (老鸟四级) | 2015-11-04 10:01

我已经解决了。项目中必须要用处理粘包的,于是采用了增加包头,判断数据包长度的方法。

支持(0) 反对(0) 小书丶 | 园豆:154 (初学一级) | 2015-11-05 09:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册