【问题标题】:address already in use error in java on udp serverudp 服务器上的 java 中的地址已在使用错误
【发布时间】:2016-01-29 15:15:56
【问题描述】:

我有一个可以做很多事情的应用程序。我想添加一种方法,使该应用程序的行为类似于套接字上的 udp 服务器。特别是它侦听端口 8888 上的 localhost 地址。我尝试使用以下代码实现此行为,但我得到了 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();
            }
        }
    }

【问题讨论】:

  • 根据 Java 的规则,receivePacket 不可能在您测试时变为 null。

标签: java sockets server udp


【解决方案1】:

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

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

对于 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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多