簡體   English   中英

套接字多線程 - 讀取輸入流暫停線程

[英]Socket Multithreading - Reading input stream pauses thread

我正在測試本地機器上的套接字。 我正在嘗試使用線程在一個程序中運行套接字和服務器。 我的服務器是一個echo服務器,因此它會發回它收到的任何消息。 我的問題是,當我在客戶端和服務器上啟動兩個線程時,當它們到達我從輸入流中讀取的部分時,它們會“凍結”。 它適用於客戶端發送消息的部分。 之后,它只是停止,因為看起來客戶端正在等待消息,即使我已經通過寫入輸出流向服務器發送消息,服務器也是如此。 代碼有什么問題?

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() 否則,它可能會等到緩沖區已滿,然后才會實際寫入,並導致相同的死鎖。

BufferedReaderreadLine方法需要一個新的行終止符來返回一個值(除非到達Stream的末尾),然后返回沒有該字符的行。 所以客戶

  1. 從用戶讀取一行到變量inputText
  2. 客戶端將inputText寫入OutputStream
  3. 服務器接收數據,但等待它收到一個新行(它沒有)。

如果您希望使用新行作為通信分隔符,請將其附加到發送數據的末尾

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM