客户端与服务器端数据接收

u011000189 2014-09-16 09:33:33
服务器端:连续发送 3笔数据
_clientSkt.Send(new byte[] { 9, 2 });
_clientSkt.Send(new byte[] { 9, 1 });
_clientSkt.Send(_msgBuff);
客户端:
byte[] buf = new byte[_maxPacket];
int byteCnt = _nws.Read(buf, 0, buf.Length);
byte[] buf 1= new byte[_maxPacket];
int byteCnt 1= _nws.Read(buf1, 0, buf1.Length);
byte[] _msgBuff = new byte[_maxPacket];
_nws.Read(_msgBuff, 0, _msgBuff.Length);

发现在客户端的_msgBuff 有时候能获取到数据,有时候却不能,求大神们指教
...全文
188 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
u011000189 2014-09-16
  • 打赏
  • 举报
回复
引用 2 楼 sunny906 的回复:
这样收发数据会造成数据粘包,所以客户端有时能收到数据有时就收不到,最简单的办法是每次发送数据之后加一个时间间隔,而且客户端只用一个socket来receive数据就可以了 服务端:

                        _clientSkt.Send(new byte[] { 9, 2 });
                       Thread.Sleep(2000);
                        _clientSkt.Send(new byte[] { 9, 1 });
                       Thread.Sleep(2000);
                        _clientSkt.Send(_msgBuff);
                       Thread.Sleep(2000);
客户端:

                                   byte[] buf = new byte[_maxPacket];
                                    int byteCnt = _nws.Read(buf, 0, buf.Length);
                                    //buf里面从0开始到byteCnt结束的内容就是你实际接收的数据
我觉得你的建议应该是对的,但是解决的方法不是很合适啊,每发送一次就要sleep一段时间,似乎大大减缓了程序的运行速度
u011000189 2014-09-16
  • 打赏
  • 举报
回复
其实现在的问题就是 如何解决 粘包
u011000189 2014-09-16
  • 打赏
  • 举报
回复
引用 8 楼 sunny906 的回复:
上面只是一种最简单的方法,而常用的做法是自定义数据包格式,发送的时候按数据包发送,接收端收到数据包后再根据格式做相应的拆包
能给点代码来看看吗?
sunny906 2014-09-16
  • 打赏
  • 举报
回复
上面只是一种最简单的方法,而常用的做法是自定义数据包格式,发送的时候按数据包发送,接收端收到数据包后再根据格式做相应的拆包
exception92 2014-09-16
  • 打赏
  • 举报
回复
客户端 可以是 一个 while (true) 的循环,不停的接受数据。
u011000189 2014-09-16
  • 打赏
  • 举报
回复
引用 5 楼 Forty2 的回复:
[quote=引用 4 楼 u011000189 的回复:] 楼上的朋友,能给出个解决方案吗?
答案就是协议啊。比如: 双方可以约定,每次固定传64字节。 双方可以约定,每次都传一行可打印的字符串(用回车符分割)。 双发可以约定,每次传4个字节的内容长度,然后跟具体的内容。 等等...[/quote] 你说的不太懂,能简单的写断小代码说明下么?
Forty2 2014-09-16
  • 打赏
  • 举报
回复
引用 4 楼 u011000189 的回复:
楼上的朋友,能给出个解决方案吗?
答案就是协议啊。比如: 双方可以约定,每次固定传64字节。 双方可以约定,每次都传一行可打印的字符串(用回车符分割)。 双发可以约定,每次传4个字节的内容长度,然后跟具体的内容。 等等...
u011000189 2014-09-16
  • 打赏
  • 举报
回复
楼上的朋友,能给出个解决方案吗?
Forty2 2014-09-16
  • 打赏
  • 举报
回复
引用 2 楼 sunny906 的回复:
...最简单的办法是每次发送数据之后加一个时间间隔,
这样做理论上不能解决问题。IP包在网际间的路由是不可控的。 设计正确的协议才是答案。
sunny906 2014-09-16
  • 打赏
  • 举报
回复
这样收发数据会造成数据粘包,所以客户端有时能收到数据有时就收不到,最简单的办法是每次发送数据之后加一个时间间隔,而且客户端只用一个socket来receive数据就可以了 服务端:

                        _clientSkt.Send(new byte[] { 9, 2 });
                       Thread.Sleep(2000);
                        _clientSkt.Send(new byte[] { 9, 1 });
                       Thread.Sleep(2000);
                        _clientSkt.Send(_msgBuff);
                       Thread.Sleep(2000);
客户端:

                                   byte[] buf = new byte[_maxPacket];
                                    int byteCnt = _nws.Read(buf, 0, buf.Length);
                                    //buf里面从0开始到byteCnt结束的内容就是你实际接收的数据
Forty2 2014-09-16
  • 打赏
  • 举报
回复
服务器端连续发送 3笔数据 但客户端可能/可以一次就收到全部的数据(也可能5次才收全)。 解决方法:数据要有分割的约定。

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧