2009-04-10 18 views
1

アプリケーションをテストするためのクイックサーバーを作成しています。クライアント側のソケットを閉じると、ソケットが閉じられたという例外は発生しません。私は100MBのランダムデータを書き続けています。クライアントの接続が切断された場合、どうすれば検出できますか?Javaソケットが検出されない

import java.io.PrintWriter; 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.net.ServerSocket; 
import java.util.Random; 

public class server { 

public static void main(String [ ] args){ 

int size = 1048576 * 100; 

String response ="HTTP/1.0 200 OK\n" + 
    "Server: server\n" + 
    // "Date: Sun, 05 Apr 2009 04:40:08 GMT\n" + 
    // "Last-Modified: Tue, 23 May 2006 22:18:19 GMT\n" + 
    "Content-Type: application/zip\n" + 
    "Content-Length: " + size + " \n" + 
    "Connection: keep-alive\n"; 

try{ 
    ServerSocket serverSocket = new ServerSocket(4444); 

    while(true){ 

    System.out.println("Listenning..."); 
    Socket clientSocket = serverSocket.accept(); 

    PrintWriter out = 
     new PrintWriter(clientSocket.getOutputStream(), true); 
    BufferedReader in = new BufferedReader 
     (new InputStreamReader(clientSocket.getInputStream())); 
    String inputLine, outputLine; 

    System.out.println("-----------Request-----------"); 
    while ((inputLine = in.readLine()) != null) { 
     if (inputLine.equals("") == true) 
     break; 
     System.out.println(inputLine); 
    } 

    System.out.println("-----------Response-----------"); 
    System.out.println(response); 
    out.print(response); 
    out.print("\r\n"); 

    //waits for the whole for to finish no exceptions are thrown 
    Random rand = new Random(); 
    for(int i=0 ; i< size ;i++){ 
     int randnum = rand.nextInt(9); 
     out.print(randnum); 
    } 

    //out.println("test"); 

    out.close(); 
    in.close(); 
    } 

}catch(Exception e) { 
    System.out.println(e.toString()); 
}   
} 
} 

答えて

5

PrintWriterクラスは、基本となる出力ストリームによってスローされる例外を無視します。ドキュメントに記載されているとおり、積極的にcheck it for errorsする必要があります。

PrintWriterの代わりにFormatterクラスを使用することをお勧めします。 PrintStreamPrintWriterのようなテキストの書式設定に役立ちます。また、その下にあるAppendable(この場合はOutputStreamWriter)の例外に沿って渡されます。

関連する問題