我是网络的初学者,正在努力在我拥有的游戏中实现它,它主要是工作但在客户端我的循环接收数据包正在停止尝试捕获。这是代码:
public void run() {
while(true){
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
try {
socket.receive(packet);
}catch(IOException e){
e.printStackTrace();
}
this.parsePacket(packet.getData(), packet.getAddress(), packet.getPort());
}
}
经过调试后,我发现循环没有超过try catch语句。(但是try似乎被激活了一次,看似没有错误)。
答案 0 :(得分:2)
首先,您提供的循环条件不是variable
,您直接使用了布尔值true
。这可能是infinite-loop
。
while(true){..... // yourCode ....}
即使socket.receive(packet);
行引发IOException
,您的循环也会继续,因为catch()
阻止了此异常。
这意味着它将执行,直到此行引发任何异常
this.parsePacket(packet.getData(), packet.getAddress(), packet.getPort());
现在,您的问题是这个方法public void receive(DatagramPacket p)
实际上方法将一直有效,直到收到datagram
但是您的循环将继续,直到异常被提出,直到this.parsePacket()
方法引发异常。
因此,请更改您的条件语句,以便如果
datagram
不再存在,则必须终止循环。
答案 1 :(得分:1)
根据方法public void receive(DatagramPacket p)
此方法将一直阻塞,直到收到数据报。
执行流程的线程被阻塞[等待直到收到数据报]。你的循环没有被打破,只是处于暂停状态。 如果发生某些异常,循环将被破坏,这个异常不会在循环体的一侧被捕获和处理。
此外,我希望您在代码中实现的建议很少。你不应该运行无限循环。您可以尝试使用true
而不是使用Thread.currentThread().isInterrupted()
,当游戏结束时,您可以在负责执行循环代码流的线程上调用interrupt()
。此外,如果在IOException的情况下你想重试(可能在重试资源是有序的,你没有得到异常)然后把catch放在循环中是O.K.否则你可以将捕获物移到循环外面,这取决于你的需要和流量。您可以为重试次数设置一个计数器。