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

标签 java sockets socket.io multicastsocket

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

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

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

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

最佳答案

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

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

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

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

关于java - 是否可以在服务器端的一个套接字中接收来自多个客户端的数据报包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51497871/

相关文章:

java - Morphia 中类似 Mysql 的日期函数

linux - 发送大量UDP数据包时如何减少系统调用开销? (Windows 和 Linux)

javascript - 如何优雅地将在线 JavaScript 依赖项添加到源代码中?

node.js - 对已解决的 promise node.js 的响应缓慢

java - Java 注解可以进行单元测试吗?

java - 通过java发送推送通知GCM

javascript - 将 socket.io 与 React 结合使用

javascript - Passport-socketio 破坏了 Passport 的实现?

Java静态和动态绑定(bind)、向上转型、重载混合在一起

c - 设置套接字选项是为什么在ICMP请求中对一个套接字(IP_HDRINCL)如此重要?