簡體   English   中英

Java BufferedReader僅讀取一次

[英]Java BufferedReader only reads once

我正在編寫一個解析操作碼的服務器(只是一個簡單的小巧的MMO服務器來自學繩路;此刻有點混亂),而我無法讓服務器解析第二個操作碼。 我不確定是什么問題。 每個操作碼的格式是8字節的標頭,例如PRINTMSG,然后是正文,在這種情況下,它可以是諸如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();

好吧,我沒有完全理解您的問題,但這是我的建議。 您是否嘗試過修改消息? 每個消息都必須以“ / n”或EOL標記結尾。 可以嗎?

更改:

if (op != "")

至:

if (!op.isEmpty())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM