簡體   English   中英

如何正確讀取和寫入 ByteBuffer?

[英]How to read from & write to ByteBuffer correctly?

我無法從 byteBuffer 獲取所有數據。 我必須采用以下方法:

客戶端:

public String sendMessage(String msg) {
        buffer = ByteBuffer.wrap(msg.getBytes());
        String response = null;
        try {
            client.write(buffer);
            buffer.clear();
            client.read(buffer);
            response = new String(buffer.array()).trim();
            System.out.println("response=" + response);
            buffer.clear();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return response;
    }

服務器端(還有另一種接受客戶端並使用選擇鍵的方法,我將其省略):

private static void serverResponse(ByteBuffer buffer, SelectionKey key) throws IOException {
        SocketChannel client = (SocketChannel) key.channel();
        client.read(buffer);
        if (new String(buffer.array()).trim().equals("exit")) {
            client.close();
        }
        else {
            ByteBuffer responseBuffer = ByteBuffer.wrap("Example message".getBytes());
            client.write(responseBuffer);
            responseBuffer.clear();
        }
    }

當我在此方法中調用 sendMessage() 並從服務器獲取數據時,我只收到一小部分數據(例如,我只從原始字符串“示例消息”中獲得“示例”)。 只有當我再次調用 sendMessage() 時,我才會收到該行的 rest(另外,我需要調用 sendMessage() 幾次)。 一旦我到達行尾,它就開始循環,下一次調用 sendMessage() 返回行的開頭。 如何一次獲取完整數據?

我很確定問題已得到解答,但我自己沒有找到解決方案。 請通過給出答案或相關問題的鏈接來幫助我

注意:我注意到我從緩沖區中獲得的字符數與發送到的字符數一樣多。 所以,我認為問題在於緩沖能力。

兩個問題:

  1. 調用write后,您應該調用flush (在這兩種情況下)。

  2. 當您讀取服務器的響應(在客戶端)時,您正在使用相同的緩沖區,該緩沖區可能不足以容納整個答案。 您使用的緩沖區大小是您在此行中創建的初始緩沖區的大小:

     ByteBuffer.wrap(msg.getBytes());

嘗試用這些建議改進它,看看會發生什么。

暫無
暫無

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

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