首页 新闻 会员 周边 捐助

基于UDP图片数据接收该如何拆分接收呢?

0
悬赏园豆:5 [已解决问题] 解决于 2017-07-14 13:44

//发送代码

UdpClient udpclient = new UdpClient();
IPEndPoint point = new IPEndPoint(IPAddress.Parse("169.254.36.14"), 6003);
try
{
//将制定路径的图片添加到文件流中
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
//通过BinaryReader类对象的ReadBytes()方法将FileStream类对象转化为二进制数组
byte[] photo = br.ReadBytes(Convert.ToInt32(fs.Length));
int totalLen = photo.Length;//获取数组的总长度
byte[] fileblock = new byte[1024];//定义一个新数组为1024个字节
int temp = totalLen / 1024;//总长度除去字节,用于条件计算
int count = 0;
for (int i = 0; i < temp; i++)
{
//第一个参数是数组,数组总长度,端点
count = udpclient.Send(photo, fileblock.Length, point);
}
if (count > 0)
{
MessageBox.Show("发送成功");
}
else
MessageBox.Show("发送失败");
udpclient.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
finally
{
udpclient.Close();
}

//接收代码

private void btnjieshou_Click(object sender, EventArgs e)
{
try
{
//创建远程端点连接
IPEndPoint point = new IPEndPoint(IPAddress.Parse("169.254.36.14"), 6002);
//建立远程连接
UdpClient udpclient = new UdpClient(point);

byte[] bytes = new byte[80000];
MemoryStream ms = new MemoryStream(bytes);
ms.Read(bytes, 0, bytes.Length);
Image img = Image.FromStream(ms, true);
Graphics g = txtmsg1.CreateGraphics();
g.DrawImage(img, 0, 0);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return;
}

}

这是接收代码:接收时因为图片发送时是通过拆分形式无序发送,接收时报错“参数无效”,该如何拆分接收呢?

Ant晨曦的主页 Ant晨曦 | 菜鸟二级 | 园豆:224
提问于:2017-07-13 09:54
< >
分享
最佳答案
0

自己定义一个报文格式,比如加一个字节表示顺序,然后再发送

收获园豆:5
hahanonym | 小虾三级 |园豆:1460 | 2017-07-13 15:14

刚刚接触套接字不深,不懂如何去定义一个报文格式,还请代码求教 

Ant晨曦 | 园豆:224 (菜鸟二级) | 2017-07-14 09:08

@陈逆天: 首先你的代码有问题,for循环发送里面,每次发送都是前1024个字节数据。

for (int i = 0; i < temp; i++)
                {                   
                    Array.Copy(photo,i*1024, fileblock,0,1024);
                    count = udpclient.Send(fileblock, fileblock.Length, point);
                }
                if(totalLen%1024!=0)
                {
                    Array.Copy(photo, temp * 1024, fileblock, 0, totalLen % 1024);
                    count = udpclient.Send(fileblock, fileblock.Length, point);
                }

我说的报文格式,意思是,fileblock里面拿出几个字节表示顺序号,然后在循环发送的时候带进去。接收数据的时候,第一步是解析顺序号,然后再是解析数据出来。

hahanonym | 园豆:1460 (小虾三级) | 2017-07-14 13:26

@hahanonym: 解析数据又该如何去编写呢?求代码

Ant晨曦 | 园豆:224 (菜鸟二级) | 2017-07-14 13:36

@陈逆天: 要求有点高啊,我都把代码写完了,还要你干啥,拒绝伸手党。

用while循环

udpclient.Receive() 

注意sleep,不要让线程阻塞

接收到的字节拆出序号和数据,然后接收完毕之后(可能还需要终止符之类的表示一个图片接收完结)

拼装数据,还原。代码自己写。

hahanonym | 园豆:1460 (小虾三级) | 2017-07-14 13:42

@hahanonym: 谢谢

Ant晨曦 | 园豆:224 (菜鸟二级) | 2017-07-14 13:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册