首页 > 解决方案 > 是否可以在服务器端的一个套接字中接收来自多个客户端的数据报包?

问题描述

我正在尝试制作一个关于从客户端向服务器发送和接收声音状态的项目,并且服务器正在结束确认,我正在使用 UDP 使通信更快,在服务器 java 类中,我在多播类中有一个单播类,多播类用于让客户端加入多播组,然后它将传递客户端类的 IP 和端口来运行声音状态发送和接收,当我运行一个客户端时,一切似乎都很好,但是当我运行我获得第二个客户端并出现错误“地址已在使用中,无法绑定”,错误在第 139 行,即 datagramSocketrecieving=new DataSocket(getsocket());

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

这是github上“服务器类”的代码,因为它有200多行

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

标签: javasocketssocket.iomulticastsocket

解决方案


是的,只要你不connect将数据报套接字连接到特定的远程地址,同一个套接字就可以用来接收来自多个客户端的数据包。在这种情况下,每个实例都DatagramPacket可以有不同的“远程地址”(IP 地址/端口号对)。您同样可以从那个套接字发送到任意数量的不同远程地址。当然,本地(服务器端)套接字地址将始终相同(好吧,从技术上讲,本地端口将始终相同,但是如果您有多个网络接口,则本地 IP 地址可能会有所不同数据包到达的地方和/或数据包发送的地方)。

您还可以使用一个“众所周知的”服务器套接字进行初始集合,然后为每个客户端创建一个新套接字。换句话说,让您的客户最初向 20002 端口发送一条消息。然后,服务器可以记录客户端的 IP 地址和端口,并创建一个新的服务器端套接字(无需指定其本地端口)。然后connect那个新的socket到客户端的IP地址和端口。连接套接字的副作用是操作系统将为新的服务器端套接字选择一个未使用的本地端口。

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

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


推荐阅读