【发布时间】: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。