Java 客户端-服务器与BufferedReader的通信
我正在测试客户机-服务器通信 我有一个服务器,它应该接收并打印消息,并使用套接字发送它从System.in获得的消息。客户端从套接字读取消息,并发回一些消息。但由于某种原因,当检查readLine上是否有来自另一端的消息时,服务器和客户端都会被锁定 该客户: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
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();
}