为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MM们 2021-06-08 12:28:11
我正在尝试制作一个关于从客户端向服务器发送和接收声音状态的项目,并且服务器正在结束回复确认,我正在使用 UDP 使通信更快,在服务器 java 类中,我在多播类中有一个单播类,多播类是为了让客户端加入多播组,然后它会传递客户端类的 IP 和端口来运行声音状态发送和接收,当我运行一个客户端时,一切似乎都很好,但是当我运行我获得的第二个客户端错误“地址已在使用,无法绑定”,错误在第 139 行,即 datagramSocketrecieving=new DataSocket(getsocket());所以我的问题是我可以在服务器端使用相同的套接字来接收来自不同客户端的数据包吗?当然,如果您发现有问题或可以进行修改以提高效率,请告诉我,谢谢这是github上“服务器类”的代码,因为它有200多行https://github.com/kameluo/tfmserver/blob/master/src/projectserver/MulticastthreadRun2.java
查看完整描述

1 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

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

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

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

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


查看完整回答
反对 回复 2021-06-10
  • 1 回答
  • 0 关注
  • 277 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信