Java BufferedReader只读取一次

Java BufferedReader只读取一次,java,networking,bufferedreader,Java,Networking,Bufferedreader,我正在写一个解析操作码的服务器,只是一个简单的MMO服务器,用来教自己如何操作;现在有点混乱,我在让服务器解析第二个操作码时遇到了问题。我不确定是什么问题。每个操作码的格式都是一个8字节的头,比如PRINTMSG,然后是body,在本例中,它可以是一条消息,比如Hello。每个操作码都以“|”结尾。我的代码似乎正确地获取和解析了每个操作码,但它没有执行超过第一个操作码的任何操作,这让我相信BufferedReaders有一些我不了解的地方。我使用read读取它,并将每个字符存储在一个48字节的数

我正在写一个解析操作码的服务器,只是一个简单的MMO服务器,用来教自己如何操作;现在有点混乱,我在让服务器解析第二个操作码时遇到了问题。我不确定是什么问题。每个操作码的格式都是一个8字节的头,比如PRINTMSG,然后是body,在本例中,它可以是一条消息,比如Hello。每个操作码都以“|”结尾。我的代码似乎正确地获取和解析了每个操作码,但它没有执行超过第一个操作码的任何操作,这让我相信BufferedReaders有一些我不了解的地方。我使用read读取它,并将每个字符存储在一个48字节的数组中。自动刷新设置为true

以下是相关的服务器代码:

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);
            }
        }


    }


}

您是否尝试过标记和重置读卡器

 bufferedReader.mark(0);
 bufferedReader.reset();
更改:

if (op != "")
致:


嗯,我不完全理解你的问题,但我的建议是。您是否尝试过修改邮件?每条消息都必须以/n结尾,或者更确切地说是下线标记。会是这样吗

你试过调试器吗?此外,除非您真的想学习如何创建自己的序列化格式,否则我建议您至少使用DataInputStream,或者更好,使用功能更丰富的序列化库。是否有可能在每次迭代中重新创建reader对象?1。如果您正在处理字节,则应该使用输入流,而不是读取器。2.摆脱现成的测试。您应该在读取方法中阻塞,而不是占用CPU。3.读者身上没有自动冲水:我想不出这句话的相关性。
if (!op.isEmpty())