UDP并发的有关问题:服务端的端口号接受的数据不容易区分

UDP并发的问题:服务端的端口号接受的数据不容易区分!
作为udp服务器,要能处理并发请求,那么在一个端口侦听就会出现数据紊乱,要区别出对应客户端的数据是不容易的。
1 . 有网友说通过就发送过来的IP地址来区分是那个终端发生过来的。
2 . 服务端申请系统临时端口来与客户端通信,客户端需记下新的服务器端口地址,这一单一通道只与该客户端交互,交互完毕关掉临时端口,临时端口的申请可以通过再建立socket 来实现。
3 . 还有提到用消息队列;



不知道用那种方式比较好,各位不惜赐教,共同探讨。

------解决方案--------------------
UDP一般是不存在并发的情况,不太清楚你的业务逻辑,一般的处理方式有以下2种情况:
1,服务器不需要保存客户端的上下文逻辑数据:
   这种情况处理起来比较简单,以下为大概的处理流程:
   1,ListenThread接收到数据后,把数据和对方的端口和IP插入数据包队列
   2,WorkThread线程处理数据包队列中的数据后把需要发送的数据插入发送队列
   3,SendThread发送数据给客户端

2,服务器需要保存客户端的上下文数据:
   这种情况下稍微比较复杂一点,如果可以用TCP就尽量用TCP,TCP比较简单一点
   一般的做法是给每个客户端分配一个唯一的ID(GUID),第一次和服务器通信时需要一个初始化的过程,
   类似TCP的握手操作,在服务端保存每个ID的上下问数据,这样服务器就可以识别每个客户端了。
   以上的方式还有些小问题,就是客户端发送数据的时候都需要带一个ID号,ID号一般都是比较长的字符
   串,在服务器上对数据进行分类的时候效率也不是很高,所以最好是用客户端的IP+PORT的整型数据作为
   KEY关联起来,这样在客户端的每个SOCKET需要定时的发心跳包服务端来保持客户端的外网端口不会比路
   器关闭。其它的细节就需要自己慢慢琢磨下了。
   
   在以前的P2P项目中就用的第二种的方式,因为需要进行内网穿透和可靠传输的处理。

   以上希望对你有所帮助