udp 服务器上 java 中的地址已在使用错误

address already in use error in java on udp server

我有一个可以做很多事情的应用程序。我想添加一种方法,使该应用程序的行为类似于套接字上的 udp 服务器。特别是它在端口 8888 上侦听本地主机地址。我尝试使用以下代码实现此行为,但我得到一个 Address already in use error。另外,整个应用程序都停留在这个 udp 服务器方法上。我想这可能是因为它全部 运行 在一个线程上。

1) 能否请您告诉我如何更正我的方法。特别是如何让这个 udp 服务器侦听器在新线程上启动。

2) 此服务器将永远监听来自客户端的 pk。根据服务器是否收到特定数据包,它需要做某些事情。逻辑是否正确:如果 packetReceived 为 != null 且数据包尚未处理,则对其进行处理。永远重复(如代码所示)?

public void startSocketListening(){
        byte[] receiveData = new byte[1024];
        DatagramPacket receivePacket;
        System.out.println("Waiting to receive...");
        while (true) {
            receivePacket = new DatagramPacket(receiveData, receiveData.length);
            try {
                DatagramSocket serverSocket = new DatagramSocket(8888);
                serverSocket.receive(receivePacket);
                //if i receive a packet and it doesn't already have a flow rule process it
                if ((receivePacket != null) && (newOFRuleAdded == false)){
                    this.rlocAddress = new String(receivePacket.getData());
                    System.out.println("RECEIVED: " + rlocAddress);
                    System.out.println("RLOC: " + rlocAddress);
                    //process the message
                    newOFRuleAdded = true;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

对于 1。) 首先将套接字创建 (serverSocket = new DatagramSocket(8888);) 移出循环。这就是您的绑定失败错误的来源。

最好将整个 startSocketListening() 代码放在 class 扩展 Thread 或实现 Runnable 的 运行() 方法中(有关线程示例,请参见下面的代码)

对于2.)可能有误会。 "serverSocket.receive(receivePacket);" 将等待直到收到数据包。因此,无论后来发生什么,都是针对从未处理过的新收到的数据包。 while 循环只是让你回到等待新数据包的状态。

这样的事情可能会。如果您不确定如何逐步调试它在收到数据包时的行为。

public class UdpListener extends Thread
{
    public void run()
    {
        byte[] receiveData = new byte[1024];
        DatagramPacket receivePacket;
        System.out.println("Waiting to receive...");
        DatagramSocket serverSocket;
        try {
            serverSocket = new DatagramSocket(8888);    
            while (true) {
                receivePacket = new DatagramPacket(receiveData, receiveData.length);
                serverSocket.receive(receivePacket);
                //if i receive a packet and it doesn't already have a flow rule process it
                if ((receivePacket != null) ){
                    System.out.println("First byte of received package is: " + receivePacket.getData()[0]);
                }
            }
        } catch (SocketException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

这样调用:

Thread t = new UdpListener();
t.start();