我有三节课。服务器启动时,它将创建一个带有guessCount和随机数的randomGame对象。客户端启动时,它将连接到服务器,并将数字传递给服务器,以播放guess方法(带有控制台输入数字)以猜测生成的randomGame的随机数。

但是以下问题。客户端每次输入数字,都会重新初始化guessCount和随机数(即,随机数不同,guessCount不能递增)。我希望每个客户端程序运行的随机数都相同,并且每次运行guess方法时,guessCount都会增加1。

public class Game {
    private int num;
    private int guessCount;
    Game (int num) {
        this.num = num;

        System.out.println("guessCount = " + guessCount);
        System.out.println("num = " + num);
    }

    public int guess (int ran) {
        int result;

        guessCount++;
        if (this.guessCount >= 10) {
            return -2;
        } else if (ran < num) {
            return -1;
        } else if (ran > num) {
            return 1;
        } else {
            return 0;
        }
    }
}


这是RandomGame

class RandomGame extends Game {
    RandomGame () {
        super(0 + (int)(Math.random() * ((90 - (0)) + 1)));
    }

    public static void main (String args[]) {
    }
}


这是服务器:

import java.io.*;
import java.net.*;

public class Q4Server {
    public static void main(String arg[]) {
        try {
            ServerSocket ss = new ServerSocket(12345);
            while(true) {
                Socket s = ss.accept();
                ClientHandler ch = new ClientHandler(s);
                ch.start();
            }
        } catch(IOException ioe) {
            ioe.printStackTrace();
        }
    }
}


这是客户端处理程序:

class  ClientHandler extends Thread {

    Socket socket;
    RandomGame g;

    public ClientHandler(Socket socket) {
        this.socket = socket;
        g = new RandomGame();
    }

    public void run() {
        try {
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            DataOutputStream dos = new DataOutputStream(socket.getOutputStream());

            int x = dis.readInt();

            int reply = this.g.guess(x);
            System.out.println("reply = " + reply);
            dos.writeInt(reply);

            //System.out.println(reply);
            //System.out.println(reply);

            socket.close();
        } catch(IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

最佳答案

尽管@ DarkSquirrel42和@jowierun是正确的,但我想扩展他们的答案并提供另一种选择。

现在,客户端连接,创建了一个新游戏,他们提供了一个猜测,服务器进行了回复和断开连接。当客户端再次连接时,将为他们提供带有新随机数的全新游戏。没有状态为客户端持有相同的游戏。

有3种可能的解决方案:


客户端可以在猜测之间保持与服务器的连接。因此,当客户端最初连接时将选择随机数,并且随着进行多个猜测,客户端和服务器将保持连接。这就是@jowierun试图让您做的事情。
客户端可以选择随机数,并每次与服务器进行通信。因此,客户端在连接时将写入两个整数。但这完全消除了对服务器的需求,这有点荒谬。
服务器可以在猜测之间保留每个客户端的状态。您可以通过几种不同的方法来完成此操作。服务器可以将与每个客户端IP关联的Game存储在Map中。当然,只有每个IP有1个客户端时,这才起作用。您可以从Socket获取IP。

一个问题是“淘汰”游戏。您不希望服务器永远缓存正在运行的游戏。也许每次客户端连接服务器时,它可以浏览游戏的Map并丢弃比某个时间段长的游戏。您需要在游戏中添加createdMillis字段。


希望这可以帮助。

09-11 18:56