Java:实现多线程 Web 服务器

标签 java multithreading

尝试处理 this assignment用于练习。很少有人被两个问题困扰。

  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. 一旦套接字关闭,线程就会终止。

  2. 要以这种形式输出到客户端,您必须生成自己的需要发送到客户端的 Http header 以及要发送到客户端的所有数据。为此,您可以执行以下操作:

    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);
        }

关于Java:实现多线程 Web 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29476803/

相关文章:

java - 何时使用 SwingUtilities.invokeAndWait/invokeLater

java - 运行线程对象的多个实例

java - 使用 Beam Java SDK 在 Google Dataflow 上安装 apt-get 依赖项

java - 如何防止 SyncInvoker.post 记录敏感数据?

java - 包是否必须与 java 文件所在的子目录相匹配?

java - java中线程的监控工具

multithreading - 快生产者和慢消费者

java - 捕获并行线程的总执行时间

optimization - 为什么 Java API 使用 int 而不是 short 或 byte?

java - 从 SQLite 数据库中选择特定行-ANDROID-SQLite 数据库