Java 服务器在一个端口上接受多个UDP数据报时出现问题

Java 服务器在一个端口上接受多个UDP数据报时出现问题,java,multithreading,loops,udp,port,Java,Multithreading,Loops,Udp,Port,我正在制作一个UDP客户端/服务器程序。客户端收集数据并将其发送到服务器 客户端在特定UDP端口6789上向服务器发送带有随机端口号的数据报。然后,客户端和服务器使用随机端口共享信息 我的问题是,只有一个客户端可以连接。我觉得这是因为6789端口从未为下一个客户端重新打开 这是仅用于在端口6789上接收初始连接的服务器的代码 public class MonitorServer extends Thread{ public static void main(String[] args)

我正在制作一个UDP客户端/服务器程序。客户端收集数据并将其发送到服务器

客户端在特定UDP端口6789上向服务器发送带有随机端口号的数据报。然后,客户端和服务器使用随机端口共享信息

我的问题是,只有一个客户端可以连接。我觉得这是因为6789端口从未为下一个客户端重新打开

这是仅用于在端口6789上接收初始连接的服务器的代码

public class MonitorServer extends Thread{

    public static void main(String[] args) {

try{

    DatagramSocket connectSocket = new DatagramSocket(6789);     
    while( true )
    {
            String portString = "";
            int portInt = 0;
            byte [] buffer = new byte[100];

System.out.println("portTest 01 " +portInt);
            DatagramPacket portPacket = new DatagramPacket(buffer, buffer.length);
            connectSocket.receive(portPacket);
            portString = new String (portPacket.getData());
            connectSocket.disconnect();  
            connectSocket.close();

System.out.println("portTest 02 " +portString);
            portString = portString.replaceAll("[^0-9.,]+","");
            portInt = Integer.parseInt(portString);

System.out.println("portTest 03 " +portString);                    
            ClientConnection c = new ClientConnection(portInt);
            new Thread(c).start();

System.out.println("portTest 04 " +portString); //<<-- never prints
   }
  }

  catch (Exception e) {}
 }

}
公共类MonitorServer扩展线程{
公共静态void main(字符串[]args){
试一试{
DatagramSocket connectSocket=新的DatagramSocket(6789);
while(true)
{
字符串portString=“”;
int-portInt=0;
字节[]缓冲区=新字节[100];
系统输出打印项次(“端口测试01”+端口输入);
DatagramPacket portPacket=新的DatagramPacket(buffer,buffer.length);
connectSocket.receive(portPacket);
portString=新字符串(portPacket.getData());
connectSocket.disconnect();
connectSocket.close();
System.out.println(“端口测试02”+端口字符串);
portString=portString.replaceAll(“[^0-9.,]+”,”);
portInt=Integer.parseInt(portString);
System.out.println(“端口测试03”+端口字符串);
ClientConnection c=新的ClientConnection(portInt);
新线程(c.start();

System.out.println(“端口测试04”+端口字符串)在代码中,MonitorServer.startServer方法永远不会返回,因为它进入了无限的while循环。这意味着
MonitorServer
的构造函数永远不会返回,这意味着main中的while循环永远不会到达close和never循环。您需要在新的
线程中启动
MonitorServer
Executor Service

您应该在5678上创建一次套接字,在接收循环之外。而不是每次接收时


注意,除了DatagramSocket.connect()的有限内容之外,UDP中没有“连接”这类东西是的,这对同行来说是未知的。

感谢您的回答John,我取出了while循环,但第一个客户端连接并发送数据的结果相同。第一个客户端之后没有其他客户端可以连接。是的,但是现在您没有任何循环,也没有启动任何线程来进行侦听。我不知道ClientConnection是什么,也不知道它是做什么的,但是你的main没有循环,因此现在你的服务器只侦听一次,并且只创建一个MonitorServer。这也意味着你的应用程序可能会在发生这种情况时立即退出。你显然有很多问题需要解决。我建议做更多的研究。我很幸运地退出了。我更改了呼叫ClientConnection的新线程仍然只适用于一个客户端。当调用ClientConnection时,它会侦听分配给客户端的端口,然后打印客户端发送的数据。这是可行的,但只适用于一个客户端。我不明白这个答案。我正在调用ClientConnection的新线程,而不是main()。感谢您的建议,我将connectSocket的创建移到了while循环之外。while循环永远不会超过“new Thread(c).start();@Joshua它可能不会超过new ClientConnection(…),这是因为您正在该构造函数中执行一些阻塞操作,而该构造函数应该在其run()方法中。
            ClientConnection c = new ClientConnection(portInt);
            new Thread(c).start();

System.out.println("portTest 04 ");  //<-- Never prints