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

时间:2016-01-29 15:15:57

标签: java sockets server udp

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

1)你能告诉我如何纠正我的方法。特别是如何使这个udp服务器监听器在新线程上启动。

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

Address already in use error

1 个答案:

答案 0 :(得分:1)

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

Best将您的整个startSocketListening()代码放在扩展Thread或实现Runnable的类的run()方法中(请参阅下面的代码以获取threadexample)

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