是否可以在服务器端的一个套接字中接收来自多个客户端的数据报包?

is it possible to receive datagrampackets from many clients in one socket in the server side?

我正在尝试制作一个关于从客户端向服务器发送和接收声音状态的项目,并且服务器正在结束返回确认,我正在使用 UDP 使通信更快,在服务器中 java class 我在多播 class 中有一个单播 class,多播 class 是为了让客户端加入多播组,然后它将传递客户端的 IP 和端口class 到 运行 发送和接收的声音状态,当我 运行 一个客户端时一切似乎都正常但是当我 运行 第二个客户端时我获得错误 "Address already in use, cannot bind" 错误在第 139 行,即 datagramSocketrecieving=new DataSocket(getsocket());

所以我的问题是我可以在服务器端使用相同的套接字来接收来自不同客户端的数据包,当然如果您发现错误或可以修改以提高效率请告诉我,谢谢

这里是 github 上 "server class" 的代码,因为它超过 200 行

https://github.com/kameluo/tfmserver/blob/master/src/projectserver/MulticastthreadRun2.java

是的,只要您不connect将数据报套接字发送到特定的远程地址,就可以使用同一个套接字从多个客户端接收数据包。在这种情况下,DatagramPacket 的每个实例都可以有不同的 "remote address"(IP 地址/端口号对)。您同样可以从那个套接字发送到任意数量的不同远程地址。本地(服务器端)套接字地址当然始终相同(从技术上讲,本地 port 始终相同,但如果您有多个网络接口,则它是本地 IP 地址可能会根据数据包到达的位置 and/or 到数据包发送的位置而有所不同。

您还可以使用一个 "well known" 服务器套接字进行初始会合,然后为每个客户端创建一个新套接字。换句话说,让您的客户最初向 20002 端口发送一条消息。然后服务器可以记下客户端的 IP 地址和端口,并创建一个新的服务器端套接字(不指定其本地端口)。然后 connect 那个新套接字到客户端的 IP 地址和端口。连接套接字的一个副作用是 OS 将为新的服务器端套接字选择一个未使用的本地端口。

服务器和该客户端之间的所有后续通信都可以使用此客户端特定的套接字。您还需要客户端注意初始回复消息中的 address/port,以便它将后续消息发送到服务器的特定于客户端的套接字。

如果你走后一条路线:因为你使用的是 UDP,你还需要为每个客户端套接字设置一些超时机制来处理异常终止(如果客户端退出而不通知你,UDP 不会通知您客户端已消失,而使用 TCP,您将在套接字上获得文件结尾)。