Java 套接字多线程-读取输入流会暂停线程

Java 套接字多线程-读取输入流会暂停线程,java,multithreading,sockets,Java,Multithreading,Sockets,我正在本地机器上测试插座。我正在尝试使用线程在一个程序中同时运行套接字和服务器。我的服务器是一个echo服务器,所以它会发回它收到的任何消息。我的问题是,当我在客户端和服务器上启动两个线程时,当它们到达我从输入流读取的部分时,它们就会“冻结”。它在客户端发送消息的部分都可以正常工作。之后,它会简单地停止,因为客户端似乎正在等待消息,服务器也在等待消息,即使我已经通过写入outputstream向服务器发送了消息。代码怎么了 Client.java @Override public voi

我正在本地机器上测试插座。我正在尝试使用线程在一个程序中同时运行套接字和服务器。我的服务器是一个echo服务器,所以它会发回它收到的任何消息。我的问题是,当我在客户端和服务器上启动两个线程时,当它们到达我从输入流读取的部分时,它们就会“冻结”。它在客户端发送消息的部分都可以正常工作。之后,它会简单地停止,因为客户端似乎正在等待消息,服务器也在等待消息,即使我已经通过写入outputstream向服务器发送了消息。代码怎么了

Client.java

@Override
    public void run() {

        try {
            Socket socket = new Socket("localhost", 22600);

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                    socket.getOutputStream()));
            BufferedReader input = new BufferedReader(new InputStreamReader(
                    System.in));
            System.out.println("Client 1");

            while (true) {

                System.out.print("\nEnter text : ");
                String inputText = input.readLine();
                writer.write(inputText);
                System.out.println("Client 2");

                System.out.println("Client 3");
                String s = br.readLine();
                System.out.println("CLIENT RECEIVED : " + s);

            }

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

    }
Server.java

@Override
public void run() {

    try {
        ServerSocket server = new ServerSocket(22600);
        Socket socket = server.accept();
        BufferedReader br = new BufferedReader(new InputStreamReader(
                socket.getInputStream()));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                socket.getOutputStream()));


        System.out.println("Server 1");
        while (true) {

            System.out.println("Server 2");
            String s = br.readLine();
            System.out.println("Server 3");
            if (s == null) {
                System.out.println("NULL SERVER SIDE ERROR");
                break;
            }

            writer.write("ECHO : " + s);
            System.out.println("SYSOUT ECHO " + s);

        }
        server.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

您正在编写一个字符串,该字符串的末尾没有行尾

            String inputText = input.readLine();
            writer.write(inputText);
            System.out.println("Client 2");
inputText
字符串不包括您键入的行尾。然后按原样将其写入服务器。但是,服务器尝试读取一行:

        String s = br.readLine();
        System.out.println("Server 3");
因此,它将一直等待,直到客户端换行发送。但是现在客户机正在等待服务器的响应,现在他们处于死锁状态


因此,您应该向客户端添加一个
writer.newLine()
,以及服务器的echo,后者也存在同样的问题。还建议在每次写入之后,在服务器和客户端上都使用
writer.flush()
。否则,在实际写入之前,它可能会等待缓冲区已满,并且会导致相同的死锁。

readLine
方法需要新的行终止符来返回值(除非到达流的结尾),然后返回不带此字符的行。那么客户呢

  • 将一行从用户读入变量
    inputText
  • 客户端将
    inputText
    写入输出流
  • 服务器接收数据,但等待直到它接收到新行(它不接收新行) 如果希望使用新行作为通信分隔符,请将其附加到发送的数据末尾

    writer.write(inputText + "\n");
    

    现在可以了。非常感谢!我从来没有想到这个问题仅仅是因为没有新线引起的。