【问题标题】:Should I have two threads for input/output or use NIO?我应该有两个线程用于输入/输出还是使用 NIO?
【发布时间】:2011-12-01 04:55:12
【问题描述】:

我一直在为我的网络课程开发一个(相对)简单的 tcp 客户端/服务器聊天程序。我遇到的问题是我正在使用阻塞调用,例如read()writeBytes()。因此,每当我尝试向我的服务器发送消息时,服务器不会将其打印出来,直到它回写一个。对于这种情况,使用一个线程输入和一个线程输出是最明智的解决方案,还是使用 NIO 会更好地为我服务?只是为了让您了解我的代码现在的样子,我的服务器是:

    ServerSocket welcomeSocket = new ServerSocket(port);

    DataOutputStream output;
    BufferedReader inFromUser = new BufferedReader( new InputStreamReader(
                System.in));
    String sentence;

    while ((sentence = inFromUser.readLine()) != null) {
            Socket connectionSocket = welcomeSocket.accept();
            output = new DataOutputStream( connectionSocket.getOutputStream());
            output.writeBytes(sentence + "\n");

            BufferedReader inFromServer = new BufferedReader( new InputStreamReader( 
                connectionSocket.getInputStream()));
            System.out.println("Client said: " + inFromServer.readLine());
            connectionSocket.close();
    }

客户端代码基本相同。感谢您的宝贵时间!

【问题讨论】:

    标签: java multithreading tcp io nio


    【解决方案1】:

    除非您想了解 NIO,否则只需使用两个线程。 Java 教程包含生成线程以处理与 ServerSocket 的客户端连接的示例。看向"Writing the Server Side of a Socket" 的底部。

    【讨论】:

    • 感谢您的回复。如果我使用两个线程,调用仍将是阻塞的,但线程将模拟非阻塞调用,对吧(听起来它会起作用)?我不太确定您链接的教程是我需要的。应该只有一个客户端和一个服务器,但是客户端可以一次向服务器发送多条消息,而无需等待回复。
    • 那些调用总是阻塞的,是的。通过将一个线程用于入站流量和一个线程用于出站流量,它们不必相互等待,因为线程的全部意义在于它们同时运行,或者至少假装同时运行,因此可以阻塞一个线程等待输入/输出,另一个继续做它需要做的任何事情。你是对的教程。它不像我想象的那样接近你正在做的事情。但是,如果您查看“多服务器”,并想象服务器在创建线程来处理输入时保持输出流......
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2013-02-16
    • 2015-05-10
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 2013-05-30
    相关资源
    最近更新 更多