【问题标题】:Issue with Server accepting multiple UDP datagrams on one port服务器在一个端口上接受多个 UDP 数据报的问题
【发布时间】:2012-05-03 13:01:48
【问题描述】:

我正在制作一个 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

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

【问题讨论】:

    标签: java multithreading loops udp port


    【解决方案1】:

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

    【讨论】:

    • 感谢约翰的回答,我取出了 while 循环,但第一个客户端连接并发送数据的结果相同。在第一个客户端之后,没有其他客户端可以连接。
    • 是的,但是现在您没有任何循环,也没有启动任何线程来进行聆听。我不知道 ClientConnection 是什么或做什么,但你的主服务器没有循环,所以现在你的服务器只监听一次并且只创建一个 MonitorServer。这也意味着一旦发生这种情况,您的应用程序可能会退出。
    • 您显然有很多问题需要解决。我建议做更多的研究。我要退出了,祝你好运。
    • 我进行了更改,为 ClientConnection 调用了一个新线程,但仍然只适用于一个客户端。当调用 ClientConnection 时,它会侦听为客户端分配的端口,然后打印客户端发送给它的数据。哪个有效,但仅适用于一个客户。
    • 我不明白这个答案。我正在为 ClientConnection 而不是 main() 调用一个新线程。
    【解决方案2】:

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

    注意,UDP 中没有“connectig”之类的东西,除了 DatagramSocket.connect() 所做的有限的事情,这是对等方不知道的。

    【讨论】:

    • 感谢您的建议,我将 connectSocket 的创建移到了 while 循环之外。 while 循环永远不会超过 "new Thread(c).start();
    • @Joshua 它可能不会超出 new ClientConnection(...),那是因为您在该构造函数中执行了一些阻塞操作,该构造函数应该在其 run() 方法中。
    猜你喜欢
    • 2019-05-26
    • 2017-07-07
    • 2012-05-28
    • 2015-05-28
    • 2014-08-18
    • 2014-03-14
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多