请问在.Net的Socket中,通信双方数据传输的机制是怎么样的? 我需要在发送方不断地发送图像,接收方不断地地接收图片。发送方发送每张图片前,先发送图片的大小DataSize。接收方接收时先接收四字节,并转成一个整型变量,即图片的大小DataSize,然后再根据DataSize设置接收缓存的大小,接着再接收图片。
接收方代码如下:
void receive() { byte[] tmp = new byte[4]; //接收图片大小 sClient.Receive(tmp, 0, 4, 0); DataSize = BitConverter.ToInt32(tmp, 0);
sClient.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveBuffer, DataSize);//设置接收缓存 buffer = new byte[DataSize]; sClient.Receive(buffer, 0, DataSize, 0); //接收图片 ms = new MemoryStream(buffer); bmp = new Bitmap(ms); pictureBox1.Image = bmp;//显示图片
theThread = new Thread(new ThreadStart(receive)); theThread.Start();//继续接收下一张图片 return; }
发送代码如下:
for (;;) { int DataSize; //准备数据 ms = new MemoryStream(); SendImage[index].Save(ms, ImageFormat.Bmp); bytData = ms.ToArray(); DataSize = bytData.Length; byte[] SizeBuff = BitConverter.GetBytes(DataSize); sendSocket.Send(SizeBuff, 0, SizeBuff.Length, 0);//发送图片大小
sendSocket.BeginSend(bytData, 0,DataSize, 0, new AsyncCallback(SendCallback), sendSocket); //发送图片 SendDone.WaitOne(); }
回调函数如下:
private void SendCallback(IAsyncResult ar) { try { Socket sendSocket = (Socket)ar.AsyncState; sendSocket.EndSend(ar); SendDone.Set();
} catch (System.Exception e) { MessageBox.Show("error3:" + e.Message + "\n" + e.Source);
}
}
实验过程中总是会报“算术运算导致溢出”,经变量监视发现接收到的DataSize会出现负值或者超大的数,从而导致溢出。但DataSize是发送端传送过来的图片大小,不可能出现负数或超大的数。我想肯定是传送和接收的过程中出现的错误。但本人对Socket编程实在不熟,所以请教各位Socket传输的过程是怎么样的?尤其是以下问题请各位解答:
发送方发送的数据在接收方未接收时都存放在哪的(我知道有sendBuffer,但实验中貌似在接收方接收之前,发送方可以连续发送好几个sendBuffer大小的数据)? 另外,接收方用receive接收指定大小的数据时,如果receiveBuffer中的数据还未达到指定的数量,接收方会怎么做? 在接收方缓冲已满的情况下,发送方会自动停止发送数据吗?还是会继续发送?
请知道的朋友不吝赐教,不胜感激!
4 回答
富国沪深
TA贡献1790条经验 获得超9个赞
不需要分两次发送吧。receive函数的返回值就是你读取到的字节数,所以在消息内容里加四个字节包含消息长度,和receive的返回值比较就知道了是不是接收正确。
不过我觉得溢出应该是你使用了长连接,循环发送导致的。
socket我也就是前端时间搞过,没有深入。说的不对还请包含
慕桂英3389331
TA贡献2036条经验 获得超8个赞
谢谢您的回答。但我考虑过,因为图片是连续发送的,所以必须先知道当前要接收的图片的大小,否则无法判断当前图片数据在哪里结束,这样连续两张图片就可能混在一起,使得无法得到完整的图片。
- 4 回答
- 0 关注
- 448 浏览
添加回答
举报
0/150
提交
取消