Я пишу сервер, который разбирает коды операций (просто небольшой хобби 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);
}
}
}
}
Вы пробовали отладчик? Кроме того, если вы действительно не пытаетесь узнать о том, как создать свой собственный формат сериализации, я бы порекомендовал, по крайней мере, использовать DataInputStream или, лучше, более функциональную библиотеку сериализации. – vanza
Вы случайно воссоздаете объект-читатель на каждой итерации? –
1. Если вы обрабатываете байты, вы должны использовать входной поток, а не читатель. 2. избавиться от теста ready(). Вы должны блокировать метод read(), а не курить CPU. 3. На считывателе нет автоматической очистки: релевантность этого замечания ускользает от меня. – EJP