UDP通信,如何实现不停的接收数据

zhangshuqiang123 zhangshuqiang123 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
服务器端发送数据代码:
                    IPAddress broadcast = IPAddress.Parse(ip);
IPEndPoint ep = new IPEndPoint(broadcast, ipPort);
udpClent.Connect(ep);

byte[] sendData = getSendData(data, dateTime);
sendData[1] = des;
udpClent.Send(sendData, 35);
byte[] temp = new byte[10] { 0x7F, 0x01, 0xE1, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
temp[1] = des;
getBCD(dateTime).CopyTo(temp, 5);
udpClent.Send(temp, 10);

客户端接收代码

private void reciveButton_Click(object sender, EventArgs e)
{
try
{
IPEndPoint ep = new IPEndPoint(IPAddress.Any, int.Parse(textPort.Text));
UdpClient client = new UdpClient(ep);
UdpState state = new UdpState();
state.e = ep;
state.u = client;
client.BeginReceive(new AsyncCallback(fuc), state); //首次触发接收数据方法
reciveButton.Enabled = false;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

private void fuc(IAsyncResult ar)
{
UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u;
IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e;

Byte[] reDatas = u.EndReceive(ar, ref e);

if (reDatas.Length > 0)
{
R = new byte[reDatas.Length];
R = reDatas;
if (recClient == null || recClient.IsAlive == false)
{
recClient = new Thread(showRec);
recClient.Start();//显示到界面
}
}
u.BeginReceive(new AsyncCallback(fuc), ar.AsyncState);
}
delegate void wakeShow();
private void showRec() //委托执行函数
{
if (!textMessage.InvokeRequired)
{
try
{
for (int i = 0; i < R.Length; i++)
{
textMessage.AppendText(R[i].ToString("X2"));
}

textMessage.AppendText("\n");
}
catch { }

textMessage.Refresh();
}
else
{
wakeShow show = new wakeShow(showRec);
Invoke(show);
}
}

这样写,首先局域网通信时成功的,但是,上面的服务器端,连着发了两条数据过来,但是客户端显示的接收值接收了后面那条数据。调试发现其实 Byte[] reDatas = u.EndReceive(ar, ref e);
这里接收是接收到了两次,但是,到下面用线程显示的时候 就只显示了一次
...全文
评论 9
收藏 已收藏
分享
返回顶部
zhangshuqiang123
C# 111,129 成员 642,538 内容