这不会循环多次,所以我无法检查是否有客户端消息:
new Thread() {
public void run() {
while(true) {
for(int I=0; I<numPlayers; I++) {
if(!players[I].isConnected()) {
players[I].drop();
System.out.println("Client disconnected!");
players[I]=null;
readers[I]=null;
writers[I]=null;
numPlayers--;
}
try {
System.out.println(readers[I].ready());
if(readers[I].ready()) {
BufferedReader reader = readers[I];
System.out.println("Reading");
switch(reader.read()) {
case PacketID.Connect:
System.out.println("Connect");
players[I].name=reader.readLine();
PrintWriter writer=writers[I];
writer.write(PacketID.Connect);
writer.write(MaxPlayers);
writer.write(numPlayers);
for(int I2=0;I2<numPlayers;I2++){
writer.println(players[I2].name);
players[I2].sendMessage(
"Client "+players[I].name+" has connected!");
}
writer.flush();
break;
case PacketID.Ready:
System.out.println("lolol lol");
break;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}.start();
我可以看到人们说我的代码混乱而且效率低下。 我以后要打扫它 另外我不知道为什么堆栈溢出会使我的代码格式不正确。
答案 0 :(得分:2)
你的循环逻辑
for(int I=0;I<numPlayers;I++)
是有缺陷的,因为它假设玩家阵列中没有“漏洞”。如果你有3个玩家连接(0,1,2)和玩家#0断开怎么办?你将减少“numPlayers”,再也不会再看第二名球员了。
另外,您似乎没有在readers
和writers
数组中检查null,因此您不久就设置readers[I]=null
,然后开始尝试引用它。
...
readers[I]=null;
writers[I]=null;
numPlayers--;
}
try {
System.out.println(readers[I].ready());
...
你可能会在所有这些中抛出一个空指针异常,并且没有看到它,因为你在一个线程中运行整个东西。
答案 1 :(得分:1)
reader.read()
可能会阻止输入
答案 2 :(得分:0)
一些错位的break语句可能会突破while循环。
答案 3 :(得分:0)
你的代码确实看起来正如while循环那样。是否有任何异常被抛出。这只是理由。
答案 4 :(得分:0)
你能把这个尝试放在别的声明中吗?
您可能不想阅读null
的读者的任何内容!
答案 5 :(得分:0)
我没有运行你的例子,但我的思考过程如下 - 线程启动并运行完成。这就是为什么我问你是否可以尝试在没有线程的情况下运行代码。这可能有助于您隔离您的问题。欢呼声
答案 6 :(得分:0)
根据打印输出(Hi false ..),我认为读者[i] .ready()实际上是返回false,这就是阻止你阅读的原因。我不确定是谁让“准备好”成为现实。没有例外,只是简单地放弃循环.. :))
答案 7 :(得分:0)
我修复了它,使用isConnected挂起服务器