我是java的真正新手,所以请原谅我这是一个毫无希望的直截了当的问题。
我的java游戏服务器中有以下内容:
// Get input from the client
DataInputStream in = new DataInputStream (server.getInputStream());
PrintStream out = new PrintStream(server.getOutputStream());
disconnect=false;
while((line = in.readLine().trim()) != null && !line.equals(".") && !line.equals("") && !disconnect) {
System.out.println("Received "+line);
if(line.equals("h")){
out.println("h"+EOF); // Client handshake
System.out.println("Matched 1");
}else if (line.equals("<policy-file-request/>")) {
out.println("..."+EOF); // Policy file
System.out.println(server.getInetAddress()+": Policy Request");
disconnect=true;
System.out.println("Matched 2");
}else if(line.substring(0,3).equals("GET")||line.substring(0,4).equals("POST")){
out.println("HTTP/1.0 200 OK\nServer: VirtuaRoom v0.9\nContent-Type: text/html\n\n..."); // HTML status page
disconnect=true;
System.out.println("Matched 3");
} else {
System.out.println(server.getInetAddress()+": Unknown command, client disconnected.");
disconnect=true;
System.out.println("Matched else");
}
}
server.close();
首先,客户端发送一个“h”数据包,并期望返回(握手)。但是,我希望它在收到无法识别的数据包时断开客户端。出于某种原因,它对握手和HTML状态请求做出了很好的响应,但是当存在未知数据包时,从不执行else子句。
由于
答案 0 :(得分:5)
根据您评论中添加的信息,似乎将要发生的是客户端发送单个字符(例如“n”)。这条线
line.substring(0,3).equals("GET")||line.substring(0,4).equals("POST"))
将被执行,但由于line
只有一个字符line.substring(0,3)
会抛出StringIndexOutOfBoundsException
。这可能导致您的程序失败,而您没有提到。或者你在代码的另一部分中进行了一些异常处理,这些异常处理是在你的代码的另一部分中没有显示出来的,这可能会导致错误或打印日志行或其他内容,而你又没有提及(或注意到它)。
尝试将substring().equals
替换为startsWith
答案 1 :(得分:1)
您需要在修剪之前检查null。 trim()的结果永远不能为空。
你应该先在readLine()之前检查断开连接,否则你总是做一个readLine()太多了。
如果你从未接触到'其他',那就意味着其他一个条件总是如此。
答案 2 :(得分:1)
您的代码存在许多问题
您是否正在使用“P”进行测试?
答案 3 :(得分:0)
其他人似乎不太可能没有执行。你确定你的循环没有退出这样的数据包,因此你的条件甚至没有运行?请问您 System.out.println(“已收到”+行);打印任何似乎缺少else语句的数据包?