Java:实现多线程web服务器

Java:实现多线程web服务器,java,multithreading,Java,Multithreading,努力练习。有两个问题困扰着我 在控制台上打印请求后,我应该在哪里停止线程?稍后,我需要在发送响应后执行此操作 我应该从哪里发回回复?我可以通过processRequest()轻松完成这项工作。我在想是否有必要发回HttpResponse。 从HttpRequest类本身发送响应可以吗 代码 主类 public final class WebServer { public static void main(String[] args) throws Exception {

努力练习。有两个问题困扰着我

  • 在控制台上打印请求后,我应该在哪里停止线程?稍后,我需要在发送响应后执行此操作
  • 我应该从哪里发回回复?我可以通过
    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();
        }
    
    }
    
  • 一旦套接字关闭,线程就会终止

  • 要输出到客户端,在此表单中,您必须生成需要发送到客户端的自己的Http头以及要发送到客户端的所有数据。为此,您可以执行以下操作:

    out.writeBytes()

  • 然后,对于您的文件,您可以执行以下操作:

            FileInputStream fileToClient;
            OutputStream toClient;
            byte[] buffer = new byte[2048];
            int bytes = 0;
            
            while ((bytes = fileToClient.read(buffer)) != -1){
                toClient.write(buffer, 0, bytes);
            }
    
  • 页面提到了Thread类的实例,但理想情况下,您不会停止线程,而是将它们返回到池中。这样您就不会为每个请求创建一个新线程,而是重用线程

    pool=Executors.newFixedThreadPool(池大小)

    while(true){ 执行(新的HttpRequest(客户端); }

  • 您可以在任何地方执行此操作,只需保持对套接字OutputStream的引用,并且不要忘记刷新它

    至于命名,从请求对象发回响应有点尴尬。只需将您的HttpRequest重命名为类似HttpRequestHandler的名称,它假设您将以您喜欢的方式处理传入的请求,应该可以