2009-04-10 46 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)的例外。