【问题标题】:How can I enable a server to accept multiple input streams from clients with distinct socket connections?如何使服务器能够接受来自具有不同套接字连接的客户端的多个输入流?
【发布时间】:2016-07-29 06:04:16
【问题描述】:

我正在尝试创建一个简单的聊天服务器,它允许多个不同的客户端通过服务器输出控制台相互聊天。每个客户端都有自己的线程写入服务器,并可以通过控制台在服务器的标准输出上查看结果。但是,我似乎无法让BufferedReader 接收来自多个客户端套接字连接的消息。

目前,第一个客户端线程通过其套接字获得对BufferedReader 的独占访问权。但是,我希望多个客户端连接到服务器的输入流阅读器,并让它等待来自具有不同套接字连接的多个客户端线程的输入。我希望客户端能够同时发布到服务器。无论有没有BufferedReader 作为我的输入流阅读器,我将如何完成此操作?

public class chatServer {

    public chatServer() throws IOException {

        int PORT = 8189;

        try (ServerSocket server = new ServerSocket(PORT)) {
            System.out.println("The server is running at "
                    + InetAddress.getByName(null) + "...");
            String rules = "The rules of this server are as follows:\n"
                    + "1.Respect your fellow chatters\n"
                    + "2.Vulgar language will result in punishment\n"
                    + "3.We reserve the right to ban you at any time.\n"
                    + "Enjoy!";

            System.out.println(rules + "\n");

            while (true) {
                try {
                    new clientHandler(server.accept()).run();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) throws IOException {
        chatServer cs = new chatServer();
    }

    class clientHandler implements Runnable {

        Socket socket;

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

        public void run() {

            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));

                String line;
                while (true) {
                    line = in.readLine();
                    if ((line == null) || line.equalsIgnoreCase("exit")) {
                        // socket.close();
                    } else {
                        System.out.println(socket.getPort() + " > " + line);
                    }
                }

            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

    }
}

public class chatClient {

    private Socket socket;
    private String name = "";   
    private String IP = "127.0.0.1";
    private int PORT = 8189;


    public chatClient(String name, String IP, int PORT) throws UnknownHostException, IOException{

        this.name = name;
        socket = new Socket(this.IP,this.PORT);

    }

    public static void main(String[] args) throws UnknownHostException, IOException{

        chatClient c1 = new chatClient("John",null,0);
        chatClient.connect(c1);

    }

    public static void connect(chatClient cc) throws IOException {

        Socket socket = cc.socket; 
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        out.println("Welcome " + cc.name);

        String message = "";
        boolean done = false;
        Scanner stdin = new Scanner(System.in);
        System.out.println("Type your message here:");

        while(!done){
        System.out.print("> ");
        message = stdin.nextLine();
        out.println(message);

        if(message.trim().equalsIgnoreCase("exit")){
            done = true;
        }

        }
    }

}

更新:我正在寻找一种合适的/替代方法来实现服务器的功能,该服务器接受来自具有不同套接字连接的不同客户端的多个帖子?如果我当前的实现不能这样做,那么我该如何修改它呢?

【问题讨论】:

    标签: java multithreading sockets inputstream bufferedreader


    【解决方案1】:

    BufferedReader 围绕单个读取器构建,而该读取器又直接或间接连接到单个数据源。一旦构建,就无法更改。

    简而言之,您的问题没有意义。每个客户端都有一个不同的套接字,该套接字又具有其唯一的输入和输出流,而这些流又必须包装在每个客户端不同的 BufferedTeader 中。不是所有客户端都共享一个。

    编辑您的实际问题与BufferedReaders 无关。在这里:

    new clientHandler(server.accept()).run();
    

    您正在内联运行处理程序,而不是作为单独的线程。 run() 应该是

    new Thread(new clientHandler(socket.accept())).start();
    

    【讨论】:

    • 我可以用什么来代替 BufferedReader,这样我就可以在多个客户端之间共享某种东西。我正在寻找一种合适的方法来实现一个服务器,该服务器接受来自具有不同套接字连接的不同客户端的多个帖子?
    • 这里没有什么可以排除这一点。您刚刚对缓冲读取器的工作方式做出了错误的假设。您需要查看 Java 教程的自定义网络部分。
    • clientHandler 扩展 Thread 与实现 Runnable 导致我的问题有什么区别? “内联运行处理程序”是什么意思?
    • 我没有说任何关于扩展 Thread 与实现 Runnable 的事情。 “内联”的意思是,错误,不是作为一个单独的线程。
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2014-03-02
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多