【问题标题】:Convert Single Threaded Server into Multi Threaded in JAVA在JAVA中将单线程服务器转换为多线程
【发布时间】:2016-08-27 03:51:04
【问题描述】:

我需要将这个单线程服务器转换为多线程服务器,这样我就可以处理来自服务器的多个请求:

public class YASGP {
    public static void main(String args[]) throws IOException {
        ServerSocket server;
        try{
            server = new ServerSocket(5559);

        System.out.println("Listening for connection on port 5559 ....");

        while (true) {
            Socket clientSocket = server.accept();
            InputStreamReader isr = new InputStreamReader(clientSocket.getInputStream());
            BufferedReader reader = new BufferedReader(isr);
            String line = reader.readLine();
            new Thread(new WorkerRunnable(clientSocket)).start();
            while (!line.isEmpty()) {
                System.out.println("----- " + line);
                if (!line.contains("OPTIONS")) {
                    //  System.out.println("Non c'è nulla!!!");
                } else {
                    timeS = line.substring(line.indexOf("timeS=") + 6, line.indexOf("&url"));
                    url = line.substring(line.indexOf("url=") + 4, line.lastIndexOf("&param"));
                    param = line.substring(line.indexOf("&param=") + 7, line.indexOf("HTTP"));
                }
                line = reader.readLine();
            }
            } 
        }
    }catch (IOException e) {
        System.out.println("Could not listen on port: 4001");
}
}
private static class RequestHandlingClass {
        public RequestHandlingClass(Socket clientSocket) {
        }
    }
}

我如何转换它?谢谢大家

【问题讨论】:

  • 1.一个线程可以处理多个客户端连接。如果您不为每个客户端启动一个新线程,应用程序将更好地扩展。 2. java 和 javascript 是两种不同的语言。请只选择一个。
  • 当前代码是否有效?您如何为 clientSocket 生成一个新线程很奇怪。目的是什么?
  • 我开始修改代码,是的,它适用于 1 个线程,其他一个没有。任何提示?我是编码新手 :)
  • @Luke - 我了解程序在做什么,但它不正确。我问了这个问题,希望你能弄清楚。这是我的 2p 价值。 Server.accept() 将被阻止,直到它收到输入。它下面的所有代码都应该放在一个新线程中来实现工作负载。在 while 循环中使用 Server.accept() 将处理更多请求,所以它很好。如果您希望我重写该代码,请告诉我?
  • Diarmuid 已经完成了 :) 参见答案 #2。

标签: java sockets server client-server


【解决方案1】:

从服务器中删除“客户端处理”代码,如下所示

    public static void main(String args[]) throws IOException {
        ServerSocket server;
        try{
            server = new ServerSocket(5559);
            System.out.println("Listening for connection on port 5559 ....");

            while (true) {
                Socket clientSocket = server.accept();
                new Thread(new WorkerRunnable(clientSocket)).start();
            }

        }catch (IOException e) {
            System.out.println("Could not listen on port: 4001");
        }
    }

然后你取出的代码进入 workerRunnable 类的 run 方法。

【讨论】:

    【解决方案2】:

    我建议你使用 excutorService api。因为它会在幕后为你管理所有线程问题

    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.submit(() -> {
      //Your code here
    });
    

    【讨论】:

      猜你喜欢
      • 2019-05-27
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多