首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

UDP 服务器端 多线程 是不是会合适

2014-01-17 
UDP 服务器端 多线程 是否会合适?下面是简单的服务器端代码,就是不停接受客户端的数据,并打印在控制台上:s

UDP 服务器端 多线程 是否会合适?

下面是简单的服务器端代码,就是不停接受客户端的数据,并打印在控制台上:

static void Main(string[] args)
        {
            IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], 60000);
            Socket s = new Socket(endPoint.Address.AddressFamily,SocketType.Dgram,ProtocolType.Udp);
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint senderRemote = (EndPoint)sender;

            s.Bind(endPoint);
            byte[] msg = new Byte[256];
            Console.ForegroundColor = ConsoleColor.Red;  //设置字体颜色为红色
            Console.WriteLine("Waiting...");
            
            LogMessage message = new LogMessage();
            
            while(true)
            {
                s.ReceiveFrom(msg, ref senderRemote);
                string deviceID = Convert.ToString(msg[5], 16);
                //string rt = byteToHexStr(msg);
                string iPstr = senderRemote.ToString();
                ipStringSplit = iPstr.Split(':') ;
                Console.ForegroundColor = ConsoleColor.Green;                

                message.DeviceID = deviceID;
                message.DeviceIP = ipStringSplit[0];
                message.DevicePort =ipStringSplit[1];
                log.Info(message);
            }         
        }


先描述下大概功能
有多个客户端,各自定时向服务器端发送数据包,服务器端把每个客户端发来的数据,打印在控制台上,在服务器端同时,将每条数据包写入日志...

有几个问题不明
1  服务器端需要为每个客户端都建立一个线程,专门处理该客户端的数据包不?
2  UDP的服务端,什么情况下,使用多线程处理每个客户端的数据比较合适?



[解决办法]
引用:
有几个问题不明
1  服务器端需要为每个客户端都建立一个线程,专门处理该客户端的数据包不?
2  UDP的服务端,什么情况下,使用多线程处理每个客户端的数据比较合适?


客户端发送一个消息,才需要服务器在线程(来自系统线程池)中处理一下。如果客户端根本没有发送消息,服务器搞什么线程?

每一个消息都可以在线程中处理。

线程(来自系统线程池,而不是胡乱创建新的线程)用来处理每一个消息请求,而不是对应什么“每个客户端”。
[解决办法]

1.UDP接收数据的只要一个线程专门接收客户端的信息,然后放到队列里面去做一个生产者 
2.开几个线程根据CPU核心数*2 来处理业务逻辑,取队列里面的信息做 Core*2个消费者。
这样一个服务端的线程只要CPU核心数*2+1就可以了。
[解决办法]
UDP是非连接的,一般不需要多个线程。比如:

static void Main(string[] args)
{
    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
    s.Bind(new IPEndPoint(IPAddress.Any, 60000));

    byte[] msg = new Byte[256];
    while (true)
    {
        EndPoint senderRemote = new IPEndPoint(IPAddress.Any, 0); 


        int length = s.ReceiveFrom(msg, ref senderRemote); //<--接收任何地址发送的信息
        LogMessage message = ParseMessage(msg, length, senderRemote);
        log.Info(message);
    } 
}


[解决办法]
应该这样理解,
UPD本身接收数据只能用1个线程去接收,也就是说你的代码是对的
但是如果你接收后处理时间比较长,那么处理就需要用线程了
也就是接收完一个消息就开启线程处理消息,而udp则继续接收新消息 

热点排行