我有一个做很多事情的应用程序。我想添加一个方法,使该应用程序的行为类似于套接字上的udp服务器。特别是它侦听端口8888上的localhost地址。我尝试使用以下代码实现此行为,但我得到A
。此外,整个应用程序都停留在这个udp服务器方法上。我想这可能是因为它全部在一个线程上运行。
1)你能告诉我如何纠正我的方法。特别是如何使这个udp服务器监听器在新线程上启动。
2)此服务器将永远监听来自客户端的pks。根据服务器是否接收特定数据包,它需要做某些事情。逻辑是否正确:如果packetReceived是!= null且数据包尚未处理,则处理它。永远重复(如代码中所示)?
Address already in use error
答案 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();