メッセージを受信する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);
}
バイトメッセージを作成し、そのサイズをヘッドで作成してから送信する単純なクライアントがあります。
ありがとう