在我的网络课程中,我的任务是将 OneWayMesg(客户端向服务器发送消息)程序转换为 TwoWayMesg(客户端向服务器发送消息,服务器向客户端发送消息)。
理论上,这应该不比仅仅调整 C2S 代码更困难,包括从 ClientReader 到 ServerReader 以及从 Client 打印行到 Server 打印行。我这样做了,虽然我的代码没有抛出任何错误,但在控制台中我无法使客户端和服务器相互通信。
我的代码哪里搞砸了?
// Client.java
BufferedReader fromUserReader = new BufferedReader(
new InputStreamReader(System.in));
// Prepare to read from server
BufferedReader fromServerReader = new BufferedReader(
new InputStreamReader(sock.getInputStream()));
// Keep doing till we get EOF from user
while (true) {
// Read a line from the keyboard
String line = fromUserReader.readLine();
// If we get null, it means user is done
if (line == null) {
System.out.println("Closing connection");
break;
}
// Send the line to the server
toServerWriter.println(line);
// Read a message from the client
String message = fromServerReader.readLine();
// Display the message
System.out.println("Server: " + message);
}
//Server.java
try {
// Create a server socket with the given port
ServerSocket serverSock = new ServerSocket(serverPort);
System.out.println("Waiting for a client ...");
// Wait to receive a connection request
Socket clientSock = serverSock.accept();
System.out.println("Connected to a client at ('" +
((InetSocketAddress) clientSock.getRemoteSocketAddress()).getAddress().getHostAddress()
+ "', '" +
((InetSocketAddress) clientSock.getRemoteSocketAddress()).getPort()
+ "')"
);
// No other clients, close the server socket
serverSock.close();
// Prepare to read from client
BufferedReader fromClientReader = new BufferedReader(
new InputStreamReader(clientSock.getInputStream()));
// Keep serving the client
while (true) {
// Read a message from the client
String message = fromClientReader.readLine();
// Read a line from the keyboard
String line = fromClientReader.readLine();
// If we get null, it means client sent EOF
if (message == null) {
System.out.println("Client closed connection");
clientSock.close();
break;
}
// Display the message
System.out.println("Client: " + message);
}
谢谢
使用客户端阅读器时注释“从键盘读取”不会使其从键盘读取。编写客户端代码来期望来自服务器的数据不会导致服务器发送数据。
您显然想要的是一个发送线路然后等待接收线路的客户端;以及等待接收行然后发送行的匹配服务器。但你的代码并没有这样做。
我诊断出没有阅读你实际写的内容的情况。这就是 90% 的调试代码:查看那里有什么,而不是你想要在那里的东西。
此外,打印出“关闭连接”并不会关闭连接。也许客户端代码随后立即退出,这将为您完成这项工作;但我们没有该代码。