读书人

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

发布时间: 2014-01-17 00:06:00 作者: rapoo

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则继续接收新消息

读书人网 >C#

热点推荐