当前位置:编程学习 > C#/ASP.NET >>

UDP数据接收与发送的问题

我用一个程序实现四条线程向服务器某个端口不断的发送UDP数据包,代码如下:
UdpClient udpClient = new UdpClient(s.sendPort);
udpClient.Connect(IPAddress.Parse(s.ip), s.port);
byte[] sendBytes = Encoding.ASCII.GetBytes(s.message);
DateTime dtEnd = DateTime.Now.AddSeconds(s.time);
int count = 0;
while (DateTime.Now.CompareTo(dtEnd) == -1)
{
    Thread.Sleep(1);
    udpClient.Send(sendBytes, sendBytes.Length);
}
udpClient.Close();
}


服务器端进行对端口的侦听,代码如下

UdpClient listener = new UdpClient((int)port);
IPEndPoint iep = null;
while (true)
{
    byte[] bytes = listener.Receive(ref iep);
    string strResult = Encoding.Default.GetString(bytes);
    InsertXml(strResult );
}


测试结果发现,发送端在10秒内发送了大约2500条数据,而接收端只处理了1200条左右的数据,
如果不执行InsertXml(strResult )函数,即接收端能接收到相同的数据,
证明接收端并不是没有接收到数据,而是在进行InsertXml(strResult )数据处理时有一部分数据丢失了,为什么?如果用异步去处理这些数据,应该如何实现,
尝试过直接创建新的线程去执行InsertXml(strResult ),但效果差不多,请问各位大虾,你们是如何去处理这些问题的 --------------------编程问答-------------------- 求大神帮忙一下,自己顶 --------------------编程问答-------------------- lock(obj){
    byte[] bytes = listener.Receive(ref iep);     
    string strResult = Encoding.Default.GetString(bytes);     
    InsertXml(strResult ); 
} --------------------编程问答--------------------
引用 2 楼 liuchaolin 的回复:
lock(obj){
    byte[] bytes = listener.Receive(ref iep);     
    string strResult = Encoding.Default.GetString(bytes);     
    InsertXml(strResult ); 
}

本线程用排他锁可以防止线程出现问题,但不能解决数据为什么丢失的问题哦 --------------------编程问答--------------------
      private Queue<String> _InsertQueue;

        private void InsertXmlThread(Object o)
        {
            while (true)
            {
                String str = String.Empty;

                lock (_InsertQueue)
                {
                    if (_InsertQueue.Count > 0)
                    {
                        str = _InsertQueue.Dequeue();
                    }
                }

                if (!String.IsNullOrEmpty(str))
                {
                    InsertXml(str);
                }
            }
        }

        private void InsertXml(String s)
        {
        }

        private void button2_Click(object sender, EventArgs e)
        {
            _InsertQueue = new Queue<String>(1000);

            ThreadPool.QueueUserWorkItem(new WaitCallback(InsertXmlThread), null);

            UdpClient listener = new UdpClient((int)port);
            IPEndPoint iep = null;
            while (true)
            {
                byte[] bytes = listener.Receive(ref iep);
                string strResult = Encoding.Default.GetString(bytes);

                lock (_InsertQueue)
                {
                    _InsertQueue.Enqueue(strResult);
                }
            }
        }


--------------------编程问答--------------------
引用 4 楼 SocketUpEx 的回复:
C# code
?



12345678910111213141516171819202122232425262728293031323334353637383940414243444546

      private Queue<String> _InsertQueue;           private void InsertXmlThread(Object o)     ……

很感谢,使用队列的办法,
不过数据量大的时候,仍然有很小部分数据丢失,不知道怎么办
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,