当前位置:编程学习 > C#/ASP.NET >>

C# TcpClient接收数据出错问题

大侠们我刚学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)就一直成功运行没有错,我学的基础不好实在看不出到底为什么,拜托了!!! --------------------编程问答-------------------- ms要关



--------------------编程问答-------------------- 对于服务端通讯,我从来不写同步阻塞代码。 --------------------编程问答--------------------
引用 1 楼  的回复:
ms要关

我关了还是一样,说接收端这里byte[] b  = new byte[len]; 算术运算导致溢出,不懂。。。。。。 --------------------编程问答--------------------
引用 2 楼  的回复:
对于服务端通讯,我从来不写同步阻塞代码。
大哥异步有什么好处吗能不能说下,我的意思是在一个线程里同步不行吗或者说有漏洞什么的??我也是刚学网络编程不懂 --------------------编程问答-------------------- 估计你接受的流有可能不全,或者数据错位等,你还是先保证接收数据的完整性吧 --------------------编程问答--------------------
接收端,收到的数据不是完整的Bitmap数据,导致的。

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

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

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

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


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

这样也可以有效避免粘包等现象。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,