我正在编写一个解析操作码的服务器(只是一个简单的小型爱好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);
}
}
}
}
你试过调试器吗?另外,除非你真的想学习如何创建你自己的序列化格式,否则我会建议至少使用DataInputStream或更好的功能丰富的序列化库。 – vanza
你有没有在每次迭代中重新创建读者对象? –
1.如果你正在处理字节,你应该使用输入流,而不是阅读器。 2.摆脱ready()测试。你应该在read()方法中阻塞,不要吸食CPU。 3.阅读器没有自动冲洗功能:这句话的相关性让我无法理解。 – EJP