Java TCP Socket阻止readLine

时间:2015-02-10 21:54:51

标签: java sockets tcp

我的客户端始终在br.readLine()处阻止。我试图添加“\ n”,但它没有解决问题。当我只使用read而不是readLine时,char数组也会被阻塞。

谁能帮帮我?

客户

        /** Benutzereingabe einlesen **/
        BufferedReader brEingabe = new BufferedReader(new InputStreamReader(System.in));
        String send = brEingabe.readLine();

        Socket socket = new Socket(host, port);

        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter pr = new PrintWriter(socket.getOutputStream());
        pr.println(send);
        pr.flush();

        System.out.println(br.readLine());  // is blocking      

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

SERVER

        ServerSocket serverSocket = new ServerSocket(port);
        while (true) {
            //ServerSocket serverSocket = new ServerSocket(port);
            Socket socket = serverSocket.accept(); // blockiert bis Anfrage kommt

            BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            String zeile;
            while ((zeile = br.readLine()) != null) {
                System.out.println(zeile);
                if (zeile.isEmpty()) break;
            }

            PrintWriter pw = new PrintWriter(socket.getOutputStream());
            pw.write("Hallo\n");
            pw.flush();

            pw.close();
            socket.close();
        }
    } 
    catch (IOException e) {
        e.printStackTrace();
    }

1 个答案:

答案 0 :(得分:2)

您编写的代码执行此操作:

  • 客户端写入一行,然后尝试读取一行。

  • 服务器读取多行,直到它获得空行或流末尾。然后它写了一行。

问题是服务器正在等待客户做一些它不会做的事情:

  • 客户不会发送空行(除非它从标准输入中读取一行),

  • 客户端无法关闭流...直到它从服务器获得响应。

因此,客户端正在等待服务器,服务器正在等待客户端。死锁。


有多种方法可以解决这个问题。一种简单的方法是改变它(在客户端)

    println(send);

到这个

    println(send); println();

然而,这里的一个问题是你的"协议"不应对案件想要发送空行作为数据。那是因为你隐含地使用空行(来自客户端)来表示"消息已完成"。