不良人24k 2024-04-30 16:57 采纳率: 0%
浏览 11
已结题

(标签-UDP|关键词-client)

使用UDP传输,偶发会出现慢1分钟;当Receive接收端处理速度太慢,接收的数据是一段时间之前的数据,怎么解决?


代码如下:
初始化
 client = new UdpClient(new IPEndPoint(IPAddress.Parse(LocalIP), Port));
                        client.Client.ReceiveTimeout = 300;
                        client.Client.SendTimeout = 300;
                        client.Client.ReceiveBufferSize = 1024 * 1024;//新增接收缓存增大
/// <summary>
        /// 网络接收线程
        /// </summary>
        private void ReceiveThread()
        {
            
            IPEndPoint remotePoint = new IPEndPoint(IPAddress.Any, 0);
            //开始循环监听
            while (true)
            {
                if (IsOpen && client != null)
                {
                    try
                    {
                        if (client.Available==0)//预防没有数据线程阻塞
                        {
                            continue;
                        }
                        byte[] bytes = client.Receive(ref remotePoint);//接收数据,**监控发现这里的数据接收慢了。**
                      
                        if (remotePoint.Address.ToString() != LocalIP)//如果为本机IP,则不触发接收事件
                        {
                            Dictionary<string, byte[]> keyValuePairs = new Dictionary<string, byte[]>();
                            keyValuePairs.Add(remotePoint.Address.ToString(), bytes);
                            lock (ReceiveList)
                            {
                                ReceiveList.Add(keyValuePairs);//这里在另外一个线程进行解析操作。
                            }


                        }
                    }
                    catch (SocketException se)
                    {
                        if (se.SocketErrorCode != SocketError.ConnectionReset)
                            //throw se;
                            Log.Instance.WriteLog("UDP报错", se.Message + se.StackTrace+"错误码:"+ se.SocketErrorCode + "");
                    }
                    catch (System.Exception ex)
                    {
                       
                        Log.Instance.WriteLog("UDP报错", ex.Message + ex.StackTrace);
                    }
                   
                }
            }
        }
  • 写回答

23条回答 默认 最新

  • 码农阿豪 Java领域优质创作者 2024-04-30 16:58
    关注
    获得0.45元问题酬金
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    出现慢1分钟的问题是因为接收端处理速度过慢,导致接收到的数据是一段时间之前的数据。解决此问题的方法可以在发送端添加时间戳,在接收端进行数据处理时判断时间戳,如果时间戳过期则丢弃该数据。代码示例如下: 发送端代码:
    byte[] data = Encoding.UTF8.GetBytes(message);
    // 添加时间戳
    long timestamp = DateTime.Now.Ticks;
    byte[] timestampBytes = BitConverter.GetBytes(timestamp);
    byte[] buffer = new byte[data.Length + timestampBytes.Length];
    Buffer.BlockCopy(timestampBytes, 0, buffer, 0, timestampBytes.Length);
    Buffer.BlockCopy(data, 0, buffer, timestampBytes.Length, data.Length);
    udpClient.Send(buffer, buffer.Length, receiverIp, receiverPort);
    
    接收端代码:
    byte[] buffer = udpClient.Receive(ref endpoint);
    // 获取时间戳
    byte[] timestampBytes = new byte[sizeof(long)];
    Buffer.BlockCopy(buffer, 0, timestampBytes, 0, timestampBytes.Length);
    long timestamp = BitConverter.ToInt64(timestampBytes, 0);
    // 判断时间戳是否过期,如果过期则丢弃该数据
    if (DateTime.Now.Ticks - timestamp > TimeSpan.FromSeconds(10).Ticks)
    {
        return;
    }
    // 获取数据
    byte[] data = new byte[buffer.Length - timestampBytes.Length];
    Buffer.BlockCopy(buffer, timestampBytes.Length, data, 0, data.Length);
    // 处理数据
    string message = Encoding.UTF8.GetString(data);
    
    在发送端添加时间戳,接收端在处理数据前判断时间戳是否过期,可以有效避免接收数据过期的情况。同时,也可以根据具体情况调整时间戳过期时间。
    评论

报告相同问题?

问题事件

  • 系统已结题 5月8日
  • 创建了问题 4月30日

悬赏问题

  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集