この問題を理解しようとするのは初めてではありませんが、これが最後になることを願っています:
背景:
Java SocketChannel NIO
サーバーがノンブロッキング モードで動作しています。
このサーバーには、メッセージを送受信する複数のクライアントがあります。
"keepalive"
各クライアントは時々メッセージでサーバーへの接続を維持します。サーバーの主なアイデアは、クライアントが「常に」接続を維持し、「プッシュ」モードでサーバーからメッセージを受信することです。
今私の質問に:
Java NIOread()
関数では、read() が -1 を返す場合、その EOS を意味します。
ここで尋ねた質問で、ソケットが現在のストリームを終了し、閉じる必要がないことを意味することに気付きました..
これについてGoogleでもう少し検索すると、接続が反対側で閉じられていることを意味することがわかりました..
「ストリーム」という言葉は正確には何を意味しますか? クライアントから送信されている現在のメッセージですか?もうメッセージを送信するクライアント側接続の機能ですか?
SocketChannel
クライアントが閉じるように言わなかった場合、クライアント側でa が閉じられるのはなぜですか?read()
return -1 とピア I/O エラーによる接続リセットの違いは何ですか?
これは私が読む方法ですSocketChannel
:
private JSONObject readIncomingData(SocketChannel socketChannel)
throws JSONException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException {
JSONObject returnObject = null;
ByteBuffer buffer = ByteBuffer.allocate(1024);
Charset charset = Charset.forName("UTF-8");
String endOfMesesage = "\"}";
String message = "";
StringBuilder input = new StringBuilder();
boolean continueReading = true;
while (continueReading && socketChannel.isOpen())
{
buffer.clear();
int bytesRead = socketChannel.read(buffer);
if (bytesRead == -1)
{
continueReading = false;
continue;
}
buffer.flip();
input.append(charset.decode(buffer));
message = input.toString();
if (message.contains(endOfMesesage))
continueReading = false;
}
if (input.length() > 0 && message.contains(endOfMesesage))
{
JSONObject messageJson = new JSONObject(input.toString());
returnObject = new JSONObject(encrypter.decrypt(messageJson.getString("m")));
}
return returnObject;
}