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要关
--------------------编程问答-------------------- 对于服务端通讯,我从来不写同步阻塞代码。 --------------------编程问答--------------------
我关了还是一样,说接收端这里byte[] b = new byte[len]; 算术运算导致溢出,不懂。。。。。。 --------------------编程问答-------------------- 大哥异步有什么好处吗能不能说下,我的意思是在一个线程里同步不行吗或者说有漏洞什么的??我也是刚学网络编程不懂 --------------------编程问答-------------------- 估计你接受的流有可能不全,或者数据错位等,你还是先保证接收数据的完整性吧 --------------------编程问答--------------------
接收端,收到的数据不是完整的Bitmap数据,导致的。
必须为你传递的数据加一个头信息,标记当前这个包的大小,然后将数据附加到头信息的后面
这样接收端收到后,先分析这个包多大,然后再读取数据,如果一次读取的数据不够,则稍后
有数据再读取,然后拼接成一个完成的Bitmap。
如果一次读取的数据超过头标记的长度,则去掉多余的数据备用。
当发完一个Bitmap后,让接收端和发送端通信1-2次,以确定上一次的接受成功了,然后再次发送
这样也可以有效避免粘包等现象。
补充:.NET技术 , C#