//发送代码
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;
}
}
这是接收代码:接收时因为图片发送时是通过拆分形式无序发送,接收时报错“参数无效”,该如何拆分接收呢?
自己定义一个报文格式,比如加一个字节表示顺序,然后再发送
刚刚接触套接字不深,不懂如何去定义一个报文格式,还请代码求教
@陈逆天: 首先你的代码有问题,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: 解析数据又该如何去编写呢?求代码
@陈逆天: 要求有点高啊,我都把代码写完了,还要你干啥,拒绝伸手党。
用while循环
udpclient.Receive()
注意sleep,不要让线程阻塞
接收到的字节拆出序号和数据,然后接收完毕之后(可能还需要终止符之类的表示一个图片接收完结)
拼装数据,还原。代码自己写。
@hahanonym: 谢谢