客户端:
string str = "Hello ";
string str1 = "World";Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
IPEndPoint localPoint1 = new IPEndPoint(IPAddress.Parse("10.46.255.100"),60000);
EndPoint tempPoint1 = (EndPoint)localPoint1;socket .SendTo(System.Text.Encoding.Default.GetBytes(str),tempPoint1);
//Thread.Sleep(1000);
socket .SendTo(System.Text.Encoding.Default.GetBytes(str1),tempPoint1);服务器端:
while(true)
{
Length = socket.ReceiveFrom(recvBuffer,ref tempPoint); Thread thread = new Thread(new ThreadStart(DistributeMsg));
thread.Start();
}
private void DistributeMsg()
{
byte[] buffer = new byte[Length];
Array.Copy(recvBuffer,0,buffer,0,Length);Console.WriteLine(System.Text.Encoding.Default.GetString(buffer));
}以上客户端和服务器都是本机。输出结果:
World
World如果加上Sleep(1000),输出正常,为什么?

解决方案 »

  1.   

    Sleep(1000)的时间延长作用能够使得第一次发送有充足的时间发送数据;如果没有这个时间延长,第一次还没有发送完第二次就开始发送,这个时候第二次发送的数据覆盖了第一次发送的,所以接收方只收到了第二次发送的数据。
      

  2.   

    显然,你不加Thread.Sleep(1000);时,这两个消息基本是同时发出的,但是你的服务器端在同一时间只处理了一个消息,如果要不加Thread.Sleep(1000);而且要让服务器接收处理所有的Socket消息,那么你就必须使用异步方式来发送和接受消息,即使用BeginSend和BeginReceive,
    如果加上Thread.Sleep(1000);那么直接使用send就没有问题,原因是客户端发送完第一条数据后,间隔1s再次发送,这时服务器已经处理完上一个Socket消息,Socket端口空闲,他会处理再次发送的消息,除非人为,否则服务器不会为这些Socket消息自动排队。