Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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 客户端-服务器与BufferedReader的通信_Java_Sockets_Client Server - Fatal编程技术网

Java 客户端-服务器与BufferedReader的通信

Java 客户端-服务器与BufferedReader的通信,java,sockets,client-server,Java,Sockets,Client Server,我正在测试客户机-服务器通信 我有一个服务器,它应该接收并打印消息,并使用套接字发送它从System.in获得的消息。客户端从套接字读取消息,并发回一些消息。但由于某种原因,当检查readLine上是否有来自另一端的消息时,服务器和客户端都会被锁定 该客户: public void run() { try { Log.i("DataManager", "Trying to connect to server"); socket.connect(ne

我正在测试客户机-服务器通信

我有一个服务器,它应该接收并打印消息,并使用套接字发送它从System.in获得的消息。客户端从套接字读取消息,并发回一些消息。但由于某种原因,当检查readLine上是否有来自另一端的消息时,服务器和客户端都会被锁定

该客户:

public void run() {
    try {
        Log.i("DataManager", "Trying to connect to server");    
        socket.connect(new InetSocketAddress(ADDRESS, PORT), 3000);
        Log.i("DataManager", "Connected to: " + socket.getInetAddress());   

        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true); //autoflush

        String inputLine;
        while (socket.isConnected()) {
            if ((inputLine = in.readLine()).isEmpty()){
                Log.i("DataManager", "Server says: " + inputLine);  
            }

            synchronized (outcoming){
                if (!outcoming.isEmpty()){
                    for (int i = 0; i < outcoming.size(); i++){
                        out.println(outcoming.get(i));
                        outcoming.remove(i);
                    }
                }
            }

        }
    } 
    ...
}//

我试图通过使用ifin.ready封装readLine语句来解决这个问题,但没有任何帮助。我在google上四处搜索,发现这是因为readLine查找eof,而来自套接字的流只有在套接字断开连接时才会结束。我不知道如何解决这个问题,除了编写某种协议,用特定的序列结束消息。有没有更好的方法解决这个问题?

为什么只记录空行?注意:socket.isConnected不是有效的测试。它永远不会变成假的。当readLine返回null时,您应该退出循环。NB readLine还查找行终止符,并且您正在发送这些终止符。任何读取方法“查找EOF”。这里的错误是您的逻辑,而不是readLine。当您需要刷新缓冲区时,不要忘记调用flush,而且您不遵循任何特定的协议/数据-flow@EJP这是因为我也希望能够发送信息,而不仅仅是陷入阅读循环。当插座断开时,停止这两种操作似乎是个好主意。我还是不明白我的逻辑有什么问题,你能解释一下吗?该问题发生在循环处理第一条传入消息之后,然后它卡在空的BufferedReader上等待新消息@user5266804我不需要刷新缓冲区,因为自动刷新标志PrintWritersocket.getOutputStream,当对等机断开连接时,trueSocket.isConnected不会神奇地变为false。发生这种情况时,您会得到一个EOS或异常。你还没有回答我关于空行的问题。这没有道理。
ServerSocket listener = new ServerSocket(PORT);
    try {
        Socket socket;
        socket = listener.accept(); //waits for connection
        System.out.println("Client connected: " + socket.getInetAddress());

        BufferedReader sysRead = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader clientIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true); //autoflush

        String inputLine;
        out.println("Hello, you are connected to server" + listener.getInetAddress());
        while (true){
            if ((inputLine = clientIn.readLine()).isEmpty()){
                System.out.println("Client says: " + inputLine);
            }
            String line = sysRead.readLine();
            if (line.equals("stop")){
                break;
            } else {
                out.println(line);
            }
        }
        socket.close();
    }