Windowsのnetstatコマンドの状態
netstatの状態列の値について調べた。
次のJavaプログラムを実行すると、
ServerSocket socket0 = new ServerSocket(80); // (1) ServerSocket socket1 = new ServerSocket(81, 0); // (2) ServerSocket socket2 = new ServerSocket(82, 0, InetAddress.getByAddress(new byte[]{0,0,0,0})); // (3) ServerSocket socket3 = new ServerSocket(83, 0, InetAddress.getByAddress(new byte[]{127,0,0,1})); // (4)
netstatの結果は下記のようになる。
C:\Users\ken>netstat -ano アクティブな接続 プロトコル ローカル アドレス 外部アドレス 状態 PID TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4304 TCP 0.0.0.0:81 0.0.0.0:0 LISTENING 4304 TCP 0.0.0.0:82 0.0.0.0:0 LISTENING 4304 TCP 127.0.0.1:83 0.0.0.0:0 LISTENING 4304
(1)待受アドレスを指定しない場合は、0.0.0.0となる。つまり、どんなIPアドレスでも自分宛のアドレスならなんでもいい。
(4)待受アドレスを指定した場合は、そのアドレスとなる。つまり、そのアドレスじゃないと受け付けない。今回の場合はループパックアドレス127.0.0.1
「状態」列の値はすべてLISTENINGだけど、まだ通信準備はできていない。
次に、下記のように待機状態にする。
Socket socket = socket0.accept();
この段階でも下記のまま。プログラムは待機状態に入る。
プロトコル ローカル アドレス 外部アドレス 状態 PID TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 5920 TCP 0.0.0.0:81 0.0.0.0:0 LISTENING 5920 TCP 0.0.0.0:82 0.0.0.0:0 LISTENING 5920 TCP 127.0.0.1:83 0.0.0.0:0 LISTENING 5920
インターネットブラウザで「http://localhost」にアクセスすると、次のような状態になる。
プロトコル ローカル アドレス 外部アドレス 状態 PID TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 5920 TCP 0.0.0.0:81 0.0.0.0:0 LISTENING 5920 TCP 0.0.0.0:82 0.0.0.0:0 LISTENING 5920 TCP 127.0.0.1:80 127.0.0.1:49927 ESTABLISHED 5920 TCP 127.0.0.1:83 0.0.0.0:0 LISTENING 5920
127.0.0.1:80のネットワーク接続が確立する。
その後、次のコードで受信内容を読み込むと、
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = null; while((line = br.readLine()) != null){ System.out.println(line); }
下記のように表示される。
GET / HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive
レスポンスがうまいこといかないので、今日はここまで。