2010-05-22 57 views
1

我是一个真正的java新手,所以请原谅我,如果这是一个绝望的直接问题。Java if/else behaviour奇怪

我从我的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子句从不执行。

感谢

+1

什么是未知包的内容替换substring().equals?你可以打印出来,然后你可以至少遍历代码,看看可能发生了什么。当存在“未知”数据包时会发生什么? – DaveJohnston 2010-05-22 10:19:47

+0

OT,但是:'(line = in.readLine()。trim())!= null'会让你在流结束时遇到麻烦,它会抛出一个'NullPointerException',因为你会尝试在'readLine'返回的'null'上调用'trim'。 – 2010-05-22 10:21:05

+0

你能告诉我们什么“收到”调试行显示你的测试未知数据包? – 2010-05-22 10:22:14

回答

5

从您的评论中添加的信息看来,会发生什么是客户端正在发送一个字符(例如'n')。该生产线

line.substring(0,3).equals("GET")||line.substring(0,4).equals("POST")) 

将被执行,但由于line只有一个字符line.substring(0,3)将抛出一个StringIndexOutOfBoundsException。无论是这导致你的程序失败,你还没有提到。或者你有一些异常处理在你没有显示的代码的另一部分进行,这可能会导致错误或者打印日志行或者你没有提到过(或者注意到它)。

尝试用startsWith

+0

这样做伎俩,非常感谢! 我实际上是压制StringIndexOutOfBoundsException,不知道会影响它,再次感谢! – Alex 2010-05-22 10:45:42

1
  1. 你需要检查空你修剪它。 trim()的结果永远不能为空。

  2. 在readLine()之前,您应该首先检查断开连接,否则您总是会执行一次readLine()过多操作。

  3. 如果你永远不会去你的'其他',这意味着其他条件之一永远是真实的。

+1

@downvoters,谢谢,-2。为什么?请指出上述错误。 – EJP 2010-05-28 02:20:04

0

其他不执行似乎不太可能。你确定你的循环不会退出这样的数据包,因此你的条件甚至不运行?你的 System.out.println(“已收到”+行);打印什么似乎缺少else语句的数据包?

1

有许多的问题与您的代码

  • in.readLine()。修剪() 的readLine做返回null,调用null.trim()会导致... NullPointerException异常
  • 是否有理由在您发送的每个响应中附加EOF。
  • 调用substring而不确定它至少有那么多元素会抛出StringIndexOutOfBoundsException(如果它更短)。

您是否正在使用“P”进行测试?