好热闹

好热闹

bbbbb

五、粘包和半包の問題

  1. \n 作業の区切りとして使用され、行を区別します。
  2. compact を使用して、読み取りが完了していない最初のデータを前方に移動し、後続の内容と統合します。

1 行のデータを読み取る際、\n の後が完全でない場合は、パケットの結合と呼ばれます。
1 行のデータを読み取る際、\n の前が完全でない場合は、ハーフパケットと呼ばれます。

image

//1. ハーフパケットとパケットの結合
public class TestNIO10 {
    public static void main(String[] args) {
        ByteBuffer buffer = ByteBuffer.allocate(50);
        buffer.put("こんにちは、sunshuaiさん\n私はあなたが好きです".getBytes());
        doLineSplit(buffer);
        buffer.put("か?\n私のことが好きですか?\n".getBytes());
        doLineSplit(buffer);
    }

    // ByteBufferが受け取るデータ \n
    private static void doLineSplit(ByteBuffer buffer) {
        buffer.flip();
        for (int i = 0; i < buffer.limit(); i++) {
            if (buffer.get(i) == '\n') {
                int length = i + 1 - buffer.position();
                ByteBuffer target = ByteBuffer.allocate(length);
                for (int j = 0; j < length; j++) {
                    target.put(buffer.get());
                }

                // 切り取り作業完了
                target.flip();
                System.out.println("StandardCharsets.UTF_8.decode(target).toString() = " + StandardCharsets.UTF_8.decode(target).toString());
            }
        }
        buffer.compact();
    }
}
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。