我正在制作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
我需要它继续运行以接受连接。我做错了什么?
答案 0 :(得分:0)
在您的代码中,MonitorServer.startServer方法永远不会返回,因为它进入无限循环。这意味着MonitorServer
的构造函数永远不会返回,这意味着main中的while循环永远不会到达close并且永远不会循环。您需要在新的MonitorServer
或Thread
Executor Service
答案 1 :(得分:0)
您应该在接收循环之外的5678上创建一次套接字。不是每次都收到。
注意,除了DatagramSocket.connect()所做的有限的东西之外,在UDP中没有'connectig'这样的东西,对等人不知道。