2013-11-03 201 views
0

我正在编写一个解析操作码的服务器(只是一个简单的小型爱好MMO服务器,教会我自己的绳子;目前有点乱),而且我在服务器解析第二操作码。我不确定问题是什么。每个操作码的格式是一个8字节的头文件,例如PRINTMSG,然后是正文,在这种情况下可以是诸如Hello的消息。每个操作码都以'|'结尾。我的代码似乎正在获取并正确解析每个操作码,但它没有执行任何超过第一个操作码的操作,这导致我相信有一些我不了解BufferedReaders。我正在使用read()读取它,并将每个字符存储在一个48字节的数组中。自动清理设置为true。Java BufferedReader只读取一次

下面是相关服务器代码:

public String readInputStream() { 
    String msg = ""; 
    char[] charArray = new char[48]; 
    short i = 0; 
    char current = '#'; 
    int characterInt = -1; 

    while (current != '|') { 
     try { 
      if (in.ready()) { 
       characterInt = in.read(); 
       if (characterInt == (-1)) continue; 
       current = (char) characterInt; 
       if (current == '|') break; 
       charArray[i] = current; 
       //if ((charArray[i] == 'n') && (charArray[i-1] == '\\')) { 
       // charArray = new char[48]; 
       //} 

       i++; 
      } 

     } 


     catch (IOException e) { 
      System.out.println("Error reading input stream in server ConnectionThread"); 
      if (DEBUGMODE) System.exit(1); 
     } 
    } 

    msg = new String(charArray); 
    msg = msg.substring(0,i); 
    return msg; 
} 
public static void printMsg(String msg) { 
    System.out.println("(Op-PRINTMSG): " +msg+"\n"); 
} 



public static void executeOpCode(String op, String body) { 
     if (op.equals("ABSPLAYX")) receivedPlayerAbsoluteX(body); 
     else if (op.equals("ABSPLAYY")) receivedPlayerAbsoluteY(body); 
     else if (op.equals("FIRSTVOL")) requestVolley(); 
     else if (op.equals("SECNDVOL")) returnVolley(body); 
     else if (op.equals("PRINTMSG")) printMsg(body); 

    } 

和主循环:

public void run() { 

    while (shouldBeListening) { 
     //Main loop for the connection thread 
     String op = readInputStream(); 
     //If stream has data, add the opcodes to opQueue. 
     if (op != ("")) { 
      separateOpsFromStream(op, incomingOpQueue); 
     } 

     //Extract incoming opcode head and body, then execute. 
     //This executes everything in the queue before moving on. 
     while (incomingOpQueue.size() > 0) { 

      op = incomingOpQueue.poll(); 
      if (op != "") { 
       String opHeader = OpCodeOperations.readHeader(op); 
       String opBody = OpCodeOperations.readBody(op); 
       playerData.executeOpCode(opHeader, opBody); 
      } 
     } 


    } 


} 
+0

你试过调试器吗?另外,除非你真的想学习如何创建你自己的序列化格式,否则我会建议至少使用DataInputStream或更好的功能丰富的序列化库。 – vanza

+0

你有没有在每次迭代中重新创建读者对象? –

+0

1.如果你正在处理字节,你应该使用输入流,而不是阅读器。 2.摆脱ready()测试。你应该在read()方法中阻塞,不要吸食CPU。 3.阅读器没有自动冲洗功能:这句话的相关性让我无法理解。 – EJP

回答

0

您是否尝试过以纪念和重置阅读器?

bufferedReader.mark(0); 
bufferedReader.reset(); 
-1

变化:

if (op != "") 

到:

if (!op.isEmpty()) 
0

嗯,我没有完全理解你的问题,但这里是我的建议。你有没有尝试修改信息?每条消息必须以“/ n”结尾,或者EOL标记。会是这样吗?