繁体   English   中英

简单的 Java 客户端和服务器套接字设置在一次迭代后中断消息循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM