Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该有两个线程用于输入/输出还是使用NIO?_Java_Multithreading_Tcp_Io_Nio - Fatal编程技术网

Java 我应该有两个线程用于输入/输出还是使用NIO?

Java 我应该有两个线程用于输入/输出还是使用NIO?,java,multithreading,tcp,io,nio,Java,Multithreading,Tcp,Io,Nio,我一直在为我的网络课程开发一个(相对)简单的tcp客户端/服务器聊天程序。我遇到的问题是我正在使用阻塞调用,例如read()和writeBytes()。因此,每当我尝试向服务器发送消息时,服务器都不会打印出来,直到它将消息写回。对于这种情况,使用一个线程作为输入,一个线程作为输出是最明智的解决方案,还是使用NIO更好?为了让您了解我的代码现在是什么样子,我的服务器是: ServerSocket welcomeSocket = new ServerSocket(port); Da

我一直在为我的网络课程开发一个(相对)简单的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();
    }

客户端代码基本相同。谢谢你的时间

除非您想了解NIO,否则只需使用两个线程即可。Java教程提供了生成线程以处理到ServerSocket的客户端连接的示例。请看底部。

谢谢您的回复。如果我使用这两个线程,调用仍然是阻塞的,但是线程将模拟非阻塞调用,对吗(这听起来像是可行的)?我不太确定你链接的教程是否是我需要的。应该只有一个客户端和一台服务器,但是客户端可以一次向服务器发送多条消息,而无需等待答复。这些调用总是被阻止,是的。通过将一个线程用于入站流量和一个线程用于出站流量,它们不必互相等待,因为线程的全部要点是它们同时运行,或者至少假装运行,因此一个线程可以被阻塞,等待输入/输出,而另一个线程可以继续执行任何需要的操作。关于教程,你是对的。它不像我想象的那样接近你正在做的事情。但是,如果您查看“多服务器”,并想象服务器在创建线程来处理输入时保留输出流。。。