import java.io.*;
import java.net.*;
public class BankClient {
public static void main(String[] args) throws IOException {
String host = "192.168.1.100";
int port = 7331;
try(
Socket bankSocket = new Socket(host, port);
PrintWriter out = new PrintWriter(bankSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(bankSocket.getInputStream()));
) {
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String fromServer;
boolean clientRunning = true;
while(clientRunning) {
System.out.println("TEST1");
while((fromServer = in.readLine()) != null) {
System.out.println(fromServer);
System.out.println("TEST2");
}
System.out.println("TEST3");
}
} catch (UnknownHostException e) {
System.err.println("Unknown host " + host);
System.exit(1);
} catch (IOException e) {
System.err.println("Disconnected");
System.exit(1);
}
}
}
所以我只是在玩Java中的网络,这是基本客户端的脚本,但出于某种原因,当我用服务器运行时,我得到了奇怪的输出:
TEST1
Server Message 1
TEST2
Server Message 2
TEST2
程序仍在运行,但输出在那里停止。令我困惑的是,TEST3并没有像我期望的那样连续输出。似乎while((fromServer = in.readLine()) != null)
在两次迭代后就像它应该中断一样,但在while循环运行之后没有任何内容。由于程序仍在运行,while(clientRunning)
没有中断,但它也没有迭代,因为没有输出TEST3。那么这里发生了什么?
答案 0 :(得分:2)
but it also isn't iterating because TEST3 isn't being outputted
每次调用in.readLine())
时,您都在等待服务器响应到达。
根据您的结果,服务器仅将2个数据包传递给客户端,从而为您提供两个结果,并将返回读取服务器的下一个输入流,并等待响应,直到服务器关闭或添加客户端套接字中的socketTimeout。
答案 1 :(得分:1)
如果您使用while((fromServer = in.readLine()) != null)
,您的程序会在打印TEST2
后等待输入。此外,TEST3
正在循环外输出,因此仅在服务器停止发送消息时输出,即(fromServer = in.readLine()) == null
时。{/ p>
你改变这个怎么样:
while((fromServer = in.readLine()) != null) {
System.out.println(fromServer);
System.out.println("TEST2");
}
对于这样的事情:
while((fromServer = in.readLine()) != "EXIT") {
System.out.println(fromServer);
System.out.println("TEST2");
}
然后,您可以使用此测试用例测试您的代码:
TEST1
Server Message 1
TEST2
Server Message 2
TEST2
END
TEST3
另外,我强烈建议您使用java.util.Scanner
来阅读流。
希望我能提供帮助。