2013-11-03 2 views
0

Я пишу сервер, который разбирает коды операций (просто небольшой хобби MMO-сервер, чтобы научить себя веревкам, в данный момент это немного грязно), и у меня возникают проблемы с тем, второй код операции. Я не уверен, в чем проблема. Формат каждого кода операции представляет собой 8-байтовый заголовок, такой как PRINTMSG, а затем тело, которое в этом случае может быть сообщением типа Hello. Каждый код операции заканчивается символом '|'. Кажется, что мой код правильно и правильно обрабатывает каждый код операции, но он не выполняет ничего предшествующего первому, что заставляет меня поверить, что я кое-что не понимаю о BufferedReaders. Я читаю его с помощью read() и сохраняю каждый символ в 48-байтовом массиве. Autoflushing установлен в 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. Неужели?

Смежные вопросы