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 );
} --------------------编程问答--------------------
本线程用排他锁可以防止线程出现问题,但不能解决数据为什么丢失的问题哦 --------------------编程问答--------------------
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);
}
}
}
--------------------编程问答--------------------
很感谢,使用队列的办法,
不过数据量大的时候,仍然有很小部分数据丢失,不知道怎么办
补充:.NET技术 , C#