繁体   English   中英

这是在并发客户端/服务器设置的服务器端实现多线程的正确方法吗?

[英]Is this the correct way to implement multithreading on Server side of concurrent client/server setup?

我已经在单线程版本和多线程版本中为我正在进行的客户端/服务器设置创建了这个代码片段。 我已经测试了两者(记录平均周转时间)并且在一次运行多个简单的服务器命令时在误差范围内获得了极其相似的结果。 我是否错误地实施了我的客户处理程序?

这是我第一次尝试实现多线程服务器,根据我的理解,这只是将客户端处理程序放入`

class ServerThread extends Thread {
    private Socket socket;
 
    public ServerThread(Socket socket) {
        this.socket = socket;
    }

` 下面是整个服务器代码的片段。

`

public class Server {
 
    public static void main(String[] args) {
        if (args.length < 1) return;
 
        int port = Integer.parseInt(args[0]);
 
        try (ServerSocket serverSocket = new ServerSocket(port)) {
 
            System.out.println("Server is listening on port " + port);
 
            while (true) {
                Socket socket = serverSocket.accept();
                System.out.println("New client connected");
 
                new ServerThread(socket).start();
            }
 
        } catch (IOException ex) {
            System.out.println("Server exception: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
} 

 class ServerThread extends Thread {
    private Socket socket;
 
    public ServerThread(Socket socket) {
        this.socket = socket;
    }
 
    public void run() {
        try {
            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
 
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
 
 
            String text;
 
            do {
                text = reader.readLine(); // reads text from client
                Process p = Runtime.getRuntime().exec(text);
                BufferedReader stdout = new BufferedReader(new InputStreamReader(p.getInputStream()));

                String outputLine;
                while ((outputLine = stdout.readLine()) != null) { // while serverMsg is not empty keep printing
                    writer.println(outputLine);
                }
                stdout.close();

                writer.println("ENDCMD");
                // Text here should just write back directly what the server is reading...?
            }

            while (!text.toLowerCase().equals("exit"));
 
            socket.close();
        } catch (IOException ex) {
            System.out.println("Server exception: " + ex.getMessage());
            ex.printStackTrace();
        }
    }
}

`

我已经测试了两者(记录平均周转时间)并且在一次运行多个简单的服务器命令时在误差范围内获得了极其相似的结果。 我是否错误地实施了我的客户处理程序?

如果您没有为发送的每个命令建立新连接,那么这将是预期的。 由于每个连接都在一个线程上运行,因此如您所示,多线程方法的速度与您没有为每个连接创建新线程的速度相同。 不同之处在于,如果没有多线程,您一次只能有一个连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM