![](/img/trans.png)
[英]Significance of Message Size on RTT: Simple Java Server/Client Socket program
[英]Simple Java client and server socket setup breaks message loop after one iteration
我有一个非常简单的客户端/服务器设置作为“猜词”游戏的类型。 服务器提示客户端猜测一个单词,客户端输入他们的猜测并将其发送回服务器,如果猜测不正确,服务器将发送该单词的第一个字母,然后是第二个,依此类推。 这个循环应该一直持续到客户端猜到单词或输入“Bye.”为止。
我的代码的问题是第一个循环只能工作。 然后它停止运行。 我尝试调整 while 循环设置,在 while(input.readLine().= null) 或 while(true) 之间切换,但它不起作用。
客户:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class MatchingClient {
public static void main(String[] args) throws IOException {
String hostName = "localhost";
int portNum = 8015;
try (
Socket guessSocket = new Socket(hostName, portNum);
PrintWriter output =
new PrintWriter(guessSocket.getOutputStream(), true);
BufferedReader input =
new BufferedReader(
new InputStreamReader(guessSocket.getInputStream()));
) {
Scanner scanner = new Scanner(System.in);
String fromServer;
System.out.println(input.readLine());
while (true) {
String msg = scanner.nextLine();
output.println(msg);
while ((fromServer = input.readLine()) != null) {
System.out.println(fromServer);
}
}
}
}
}
服务器:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class MatchingServer {
public static void main(String[] args) {
String guess = "java";
int portNum = 8015;
try (
ServerSocket serverSocket = new ServerSocket(portNum);
Socket clientSocket = serverSocket.accept();
PrintWriter output =
new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader input = new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
){
// Initiate conversation with client
System.out.println("Client connected");
output.println("Make a guess: ");
int counter = 0;
String clientResponse;
String serverReponse;
while (true) {
System.out.println("Test");
clientResponse = input.readLine();
if (clientResponse.equals("Bye.") || clientResponse.equals("java")) {
break;
} else {
serverReponse = "Guess again";
serverReponse += "\nHere's a hint\n";
serverReponse += guess.charAt(counter);
output.println(serverReponse);
counter++;
}
}
} catch (IOException e) {
System.out.println("Exception caught when trying to listen on port "
+ portNum + " or listening for a connection");
System.out.println(e.getMessage());
}
}
}
这是由于您的程序中的一个小设计问题。 当客户端和服务器相互交谈时,应该有一个协议,即一个消息结构,当远程应用程序完成它的消息时,它会变得清晰。 否则,当没有发送任何内容时,您可能最终会等待输入 stream。 这就是这里正在发生的事情。
因此,这里仅针对您的类中的通信部分更改了代码。 服务器将以over
结束它的消息。 当客户端看到这个词时,它不再尝试从套接字输入中读取。
添加的确切行用CHANGED
注释。
while( true ){
System.out.println( "Test" );
clientResponse = input.readLine();
if( clientResponse.equals( "Bye." ) || clientResponse.equals( "java" ) ){
break;
}
else{
serverReponse = "Guess again\n";
serverReponse += "Here's a hint\n";
/* CHANGED:
* (a) A newline after the hint character
* (b) Add a message completion marker that the client also understands. */
serverReponse += guess.charAt( counter ) + "\n";
serverReponse += "over";
output.println( serverReponse );
counter++;
}
}
while (true) {
String msg = scanner.nextLine();
output.println(msg);
while ((fromServer = input.readLine()) != null) {
/* CHANGED: If the response is completed, break and to go back to accepting the user input. */
if( fromServer.equalsIgnoreCase( "over" ) ) break;
System.out.println(fromServer);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.