【问题标题】:Socket Multithreading - Reading input stream pauses thread套接字多线程 - 读取输入流暂停线程
【发布时间】:2015-07-12 07:19:48
【问题描述】:

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

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();
        }

    }

服务器.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();
    }

}

【问题讨论】:

    标签: java multithreading sockets


    【解决方案1】:

    您正在编写一个结尾没有行尾的字符串。

                String inputText = input.readLine();
                writer.write(inputText);
                System.out.println("Client 2");
    

    inputText 字符串不包括您键入的行尾。然后您将其按原样写入服务器。但是,服务器尝试读取一行:

            String s = br.readLine();
            System.out.println("Server 3");
    

    所以它会一直等到客户端发送一个换行符。但是此时客户端正在等待服务器的答复,现在它们已经死锁了。

    因此,您应该向客户端添加writer.newLine(),以及服务器的回显,这会遇到同样的问题。还建议在每次写入后,在服务器和客户端上都使用writer.flush()。否则,可能会等到缓冲区满才真正写入,同样会导致死锁。

    【讨论】:

    • 现在可以使用了。非常感谢!我从没想过问题仅仅是因为缺少换行符。
    【解决方案2】:

    BufferedReaderreadLine 方法需要一个新的行终止符来返回一个值(除非到达Stream 的末尾),然后返回没有这个字符的行。所以客户端

    1. 从用户读取一行到变量inputText
    2. 客户端将inputText 写入OutputStream
    3. 服务器接收数据,但一直等到它接收到一个新行(它没有)。

    如果您希望使用换行符作为通信的分隔符,请将其附加到发送数据的末尾

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 2018-09-21
      • 1970-01-01
      • 2014-07-20
      相关资源
      最近更新 更多