服务器在一个端口上接受多个UDP数据报的问题

时间:2012-04-22 20:11:35

标签: java multithreading loops udp port

我正在制作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) {}
 }

}

似乎这部分代码只运行一次。我添加了System.outs来进行故障排除,看起来它停在:

            ClientConnection c = new ClientConnection(portInt);
            new Thread(c).start();

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

我需要它继续运行以接受连接。我做错了什么?

2 个答案:

答案 0 :(得分:0)

在您的代码中,MonitorServer.startServer方法永远不会返回,因为它进入无限循环。这意味着MonitorServer的构造函数永远不会返回,这意味着main中的while循环永远不会到达close并且永远不会循环。您需要在新的MonitorServerThread

中启动Executor Service

答案 1 :(得分:0)

您应该在接收循环之外的5678上创建一次套接字。不是每次都收到。

注意,除了DatagramSocket.connect()所做的有限的东西之外,在UDP中没有'connectig'这样的东西,对等人不知道。