2015-04-06 150 views
0

尝试在this assignment上练习。有两个问题陷入困境。Java:实现多线程Web服务器

  1. 在控制台上打印请求后,我应该在哪里停止线程?稍后,我需要在发送回复后这样做。
  2. 从哪里发回应答?我可以从processRequest()轻松完成。正在考虑是否无论如何发回HttpResponse。 从HttpRequest类本身发回响应可以吗?

代码

主要类

public final class WebServer { 

    public static void main(String[] args) throws Exception { 
     int port = 1983; 
     final ServerSocket server = new ServerSocket(port); 
     System.out.println("Comes here"); 
     Socket client = null; 
     while (true) { 
      client = server.accept(); 
      System.out.println("Got the connection" + client.toString()); 
      final HttpRequest request = new HttpRequest(client); 
      Thread thread = new Thread(request); 
      thread.start(); 

     } 
    } 

} 

HttpRequest.java

final class HttpRequest implements Runnable { 

    Socket socket; 

    public HttpRequest(Socket socket) { 
     this.socket = socket; 
    } 

    @Override 
    public void run() { 
     try { 
      processRequest(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void processRequest() throws IOException { 
     String headerline = null; 
     DataOutputStream out = null; 
     BufferedReader in = null; 
     out = new DataOutputStream(socket.getOutputStream()); 
     in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     while ((headerline = in.readLine()).length() != 0) { 
      System.out.println(headerline); 
     } 
     out.close(); 
     in.close(); 
     socket.close(); 
    } 

} 

回答

1
  1. 线程将立即终止当插座关闭时。

  2. 要以这种形式输出到客户端,您必须生成您自己的Http标头,需要发送给客户端以及您发送给客户端的所有数据。要做到这一点,你可以这样做:

    out.writeBytes(<HttpHeaderString>);

然后为您的文件,你可以这样做:

 FileInputStream fileToClient; 
     OutputStream toClient; 
     byte[] buffer = new byte[2048]; 
     int bytes = 0; 

     while ((bytes = fileToClient.read(buffer)) != -1){ 
      toClient.write(buffer, 0, bytes); 
     } 
1
  1. 页提到Thread类的实例,但理想情况下,您不会停止线程,而是将它们还给游泳池。这样你就不会为每个请求创建一个新的线程,而是重用线程。

    pool = Executors.newFixedThreadPool(poolSize);

    ,而(真){ pool.execute(新的HttpRequest(客户端);} 。

  2. 你可以做到这一点从任何地方只是不停参考Socket的OutputStream的,不要忘记刷新它

    至于命名,从请求对象发回响应有点麻烦,只需将HttpRequest重命名为像HttpRequestHandler这样的东西,它假定您可以按照您喜欢的方式处理传入请求,并且应该没问题。