我有这个客户端,服务器信息并不重要。此代码的输出非常随机。
class Client {
public static void main(String args[]) throws Exception
{
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
Socket clientSocket = new Socket("127.0.0.1", 10004);//this will become the addr of the server you want to input.
InetAddress host = clientSocket.getInetAddress();
// System.out.println(host);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
boolean exit = false;
while (!exit) {
while (inFromServer.ready()) {
System.out.println(inFromServer.readLine());
}
String sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + "\n");
}
clientSocket.close();
}
}
如果我在调试模式下运行它,它始终是正确的结果。 E.g。
当它不处于调试模式时,一切都会出错。我甚至没有收到服务器的初始请求。到底是怎么回事?我认为读取行可能执行得太快了?
答案 0 :(得分:1)
in.ready()
不会等待任何数据可用。当客户端读取该行时服务器尚未发送数据,您将完全跳过readLine()
。
只需删除while
并执行普通readLine()
。
如果有需要等待服务器多行的阶段,则需要实现更多逻辑。通常,服务器将发送“消息结束”标记以向客户端表明它已完成。例如,当服务器完成时,它可以发送消息“END-OF-MESSAGE”。在客户端代码中,您可以执行以下操作:
boolean serverDone = false;
while (!serverDone) {
String message = in.readLine();
if (message == null) {
// handle this problem: the server has closed the connection
serverDone = true; // or return, or throw
} else if ("END-OF-MESSAGE".equals(message)) {
serverDone = true;
}
}