0

メッセージを受信するJava NIOサーバーを作成しています。各メッセージのサイズはメッセージの先頭にあるため、最初にデフォルトサイズ(44)のバッファーに読み込んでから、このバッファーから完全なサイズを取得します、次に、残りのメッセージ(本文)を取得することになっている新しいバッファを作成し、 System.arrayCopy() を使用して完全なメッセージで配列を作成します。この操作は正常に機能しています。問題は、2 番目のバッファー (メッセージの本文) にサイズがありますが、正しいデータが含まれていないことです。あなたが何か間違っている場合は、ここに私のコードがあります:

public void getMessageByMessageSize(SelectionKey key) {
    socket = (SocketChannel) key.channel();
    int nBytes = 0;
    byte[] message = null;
    try {
        nBytes = socket.read(headBuffer);
        if (nBytes < 0) {
            try {
                key.channel().close();
                key.cancel();
                return;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
                    //size of the message body
        int corpMessageSize = MessageUtils.getMessageSize(headBuffer)
                - HEADER_SIZE;
        ByteBuffer corpsBuffer = ByteBuffer.allocate(corpMessageSize);
        headBuffer.flip();
        nBytes += socket.read(corpsBuffer);
        corpsBuffer.flip();
        byte[] corp=corpsBuffer.array();

        message = new byte[nBytes];
        System.arraycopy(headBuffer.array(), 0, message, 0, HEADER_SIZE);
        System.arraycopy(corpsBuffer.array(), 0, message, HEADER_SIZE,
                nBytes - HEADER_SIZE);
        System.out.println(nBytes);
        headBuffer.clear();
        corpsBuffer.clear();
    } catch (IOException e) {
        e.printStackTrace();
        try {
            key.channel().close();
            key.cancel();
            return;
        } catch (IOException ex) {
            e.printStackTrace();
        }
    }

    this.worker.verifyConnection(this,message, key);
    //this.worker.processData(this, socket, message, nBytes);
}

バイトメッセージを作成し、そのサイズをヘッドで作成してから送信する単純なクライアントがあります。

ありがとう

4

1 に答える 1

1

nBytes += socket.read(corpsBuffer);

これによりメッセージ全体が読み取られ、バッファがいっぱいになると想定しています。TCP/IP にはそれを保証するものは何もありません。ループする必要があります。ノンブロッキング モードの場合、読み取りの長さがゼロの場合は、再選択する必要があります。

于 2012-07-12T23:18:01.123 に答える