繁体   English   中英

是否可以在服务器端的一个套接字中从许多客户端接收数据报分组?

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

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

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

这是github上“服务器类”的代码,导致其超过200行

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

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

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

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

如果采用后一种方法:由于使用的是UDP,因此还需要为每个每个客户端套接字都具有某种超时机制,以处理异常终止(如果客户端在不通知您的情况下退出,则UDP不会通知您该客户端已经消失了,而使用TCP时,您将在套接字上获得文件结尾)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM