我正在尝试制作一个有关从客户端向服务器发送和接收声音状态的项目,并且服务器正在终止回执,我正在使用UDP使通信更快,在服务器java类中,我内部有一个单播类一个多播类,该多播类用于让客户端加入多播组,然后它将通过客户端类的IP和端口来运行声音状态的发送和接收,当我运行一个客户端时,一切似乎都很好,但是当我运行我获得的第二个客户端,并且错误“地址已在使用中,无法绑定”,并且错误在第139行,即datagramSocketrecieving = new DataSocket(getsocket());
所以我的问题是,我可以在服务器端使用相同的套接字来接收来自不同客户端的数据包吗,当然,如果您发现错误或可以进行更有效的修改,请告诉我,谢谢
这是github上“服务器类”的代码,导致其超过200行
https://github.com/kameluo/tfmserver/blob/master/src/projectserver/MulticastthreadRun2.java
答案 0 :(得分:1)
是的,只要不将数据报套接字connect
到特定的远程地址,就可以使用同一套接字接收来自多个客户端的数据包。在这种情况下,DatagramPacket
的每个实例可以具有不同的“远程地址”(IP地址/端口号对)。同样,您也可以从该套接字发送到任意数量的不同远程地址。当然,本地(服务器端)套接字地址将始终是相同的(从技术上讲,本地 port 始终是相同的,但是如果您有多个网络接口,则本地IP地址可能会根据数据包到达的位置和/或数据包的发送位置而有所不同。
您还可以使用一个“知名”服务器套接字进行初始集合,然后为每个客户端创建一个新的套接字。换句话说,让您的客户端最初向20002端口发送一条消息。然后,服务器可以记下客户端的IP地址和端口,并创建一个新的服务器端套接字(不指定其本地端口)。然后connect
将新的套接字插入客户端的IP地址和端口。连接套接字的副作用是操作系统将为新的服务器端套接字选择一个未使用的本地端口。
然后,服务器与该客户端之间的所有后续通信都可以使用此客户端特定的套接字。您还需要客户端注意初始回复消息中的地址/端口,以便它将后续消息发送到服务器的客户端特定套接字。
如果使用后一种方法:由于使用的是UDP,因此还需要为每个客户端套接字具有某种超时机制,以处理异常终止(如果客户端在不通知您的情况下退出,UDP不会通知您客户端消失了,而使用TCP,您将在套接字上获得文件结尾)。