C# TcpClient接收数据出错问题

Love_ZzM_Xi 2012-07-30 10:37:05
大侠们我刚学C#网络编程,遇到了个问题请帮下忙。
【接收方】
............ //上面是连接代码没有出错的

while (true)//这是一个截屏的程序,发送方每次都将自己的屏幕转为字节数组发送
{
byte[] L= new byte[sizeof(int)];
net.Read(L, 0, sizeof(int)); //L字节数组接收将要接受的图片的大小
int len = BitConverter.ToInt32(L, 0); //转为整型
byte[] b = new byte[len]; //创建图片的字节数组
net.Write(b, 0, 1); //告诉对方可以发送了
net.Read(b, 0, len); //阻塞接受图片数据
//////////////////////////////////下面的代码是转为BitmapImage并显示的这个没错
MemoryStream ms = new MemoryStream(b);
Bitmap bmp = (Bitmap)Bitmap.FromStream(ms);
IntPtr ip = bmp.GetHbitmap();
this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, new ChangeImage(changeImage), ip, index);
/ ////////////////////////////
net.Write(b, 0, 1); //告诉发送端可以发下一张了
}
【发送端】
................
while (true)
{
byte[] b = BitmapTobytes(GetScreenSnapshot()); //获得屏幕并转为字节数组
byte[] L = BitConverter.GetBytes(b.Length); //将屏幕的字节数组的大小转为字节数组
net.Write(L, 0, sizeof(int)); //发给接收端将要发送的图片大小
net.Read(L, 0, 1);//暂停 //等到通知可以发送图片信息了
net.Write(b, 0, b.Length); //阻塞发送图片信息
net.Read(L, 0, 1); //等到通知可以发送下一张
}
以上就是我的代码,一般是运行了一会儿(大概几秒后)就会出现问题说是 Bitmap bmp = (Bitmap)Bitmap.FromStream(ms)参数错误,也就是ms有问题。请大侠们帮忙看下。还有就是如果我把两端中间那两句等到通知的代码去掉,发送端加上Thread.Sleep(10)就一直成功运行没有错,我学的基础不好实在看不出到底为什么,拜托了!!!
...全文
715 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Love_ZzM_Xi 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
对于服务端通讯,我从来不写同步阻塞代码。
[/Quote]大哥异步有什么好处吗能不能说下,我的意思是在一个线程里同步不行吗或者说有漏洞什么的??我也是刚学网络编程不懂
Love_ZzM_Xi 2012-07-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
ms要关
[/Quote]
我关了还是一样,说接收端这里byte[] b = new byte[len]; 算术运算导致溢出,不懂。。。。。。
isjoe 2012-07-31
  • 打赏
  • 举报
回复

接收端,收到的数据不是完整的Bitmap数据,导致的。

必须为你传递的数据加一个头信息,标记当前这个包的大小,然后将数据附加到头信息的后面

这样接收端收到后,先分析这个包多大,然后再读取数据,如果一次读取的数据不够,则稍后

有数据再读取,然后拼接成一个完成的Bitmap。

如果一次读取的数据超过头标记的长度,则去掉多余的数据备用。


当发完一个Bitmap后,让接收端和发送端通信1-2次,以确定上一次的接受成功了,然后再次发送

这样也可以有效避免粘包等现象。
bdmh 2012-07-31
  • 打赏
  • 举报
回复
估计你接受的流有可能不全,或者数据错位等,你还是先保证接收数据的完整性吧
  • 打赏
  • 举报
回复
对于服务端通讯,我从来不写同步阻塞代码。
SocketUpEx 2012-07-30
  • 打赏
  • 举报
回复
ms要关



111,097

社区成员

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

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

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