2017-05-03 13 views
0

クライアントでは、clent.close()を呼び出すと、FINパケットを送信して接続を終了しようとします。サーバー側の接続を閉じるFINパケットがあることを知るサーバー側のAPIはありますか?そうでない場合、なぜですか?両方の側で接続を閉じるための最良の方法は何ですか?クライアントがソケットでFINパッケージを送信したことを知るにはどうすればよいですか?

クライアントコード:

String host = "127.0.0.1"; 
    int port = 8899; 
    Socket client = new Socket(host, port); 
    String data = "Hello world"; 
    Writer writer = new OutputStreamWriter(client.getOutputStream()); 
    writer.write(data); 
    writer.flush(); 
    writer.close(); 
    client.close(); 

例はhereを見ることができます。

+0

**パケット**(*パッケージではない)。そしてそれはプロトコルスタックのより低いレベルで起こります。 –

答えて

0

ピアがFINを受信:

  • read()は-1を返します
  • readLine()readXXX()
  • はnullを返します。何 ウォン、他のX用EOFException

がスローされます'が発生する:

  • Socket.isClosed()は魔法
  • Socket.isConnected()魔法のように偽になることはありません真になることはありません。
0

サーバがFINを受信すると、これはストリームの終わりの状態として扱われます。

つまり、ソケットのInputStreamでreadを呼び出すたびに、データを読み込む代わりに-1が返されます。ファイルから読み込んでファイルの最後まで来た場合と同じです。

+0

「ゼロバイト」ではなく-1が得られます。 zero-lengthバッファーまたはゼロの 'length'パラメーターを指定した場合、ゼロブロックは(i)ノンブロッキングソケットチャネルまたは(ii)入力ストリームでのみ有効で、どちらの場合でもストリームの終わりを示しません。 – EJP

+0

@EJPあなたが正しいです、私はそれをCと混同していました。 – immibis

関連する問題