2009-04-10 32 views
1

我在寫一個快速服務器來測試應用程序。如果我關閉客戶端的套接字,它不會拋出套接字關閉的異常。我一直在寫100mb的隨機數據(它應該做什麼)。我如何檢測客戶端是否關閉連接?未檢測到Java Socket關閉

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

您可能會考慮使用Formatter類而不是PrintWriter。它可以幫助你處理PrintStreamPrintWriter這樣的文本格式(還有更多),並且還會傳送潛在的Appendable(在這種情況下應該是OutputStreamWriter)的例外。