我有三节课。当服务器启动时,它会创建一个带有guessCount和随机数的randomGame对象。当客户端启动时,它连接到服务器并将号码传递给服务器以播放guess方法(使用控制台输入号码)来猜测生成的randomGame的随机数。
但以下有问题。客户端每次输入数字,guessCount&随机数重新初始化(即随机数不同,guessCount不能递增)。我希望每个运行的客户端程序的随机数相同,每次猜测方法运行时,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();
}
}
}
答案 0 :(得分:1)
虽然@ DarkSquirrel42和@jowierun是正确的,但我想扩展他们的答案并提供另一种选择。
现在,客户端连接,创建一个新游戏,他们提供猜测,服务器回复和断开连接。当客户再次连接时,他们将获得一个带有新随机数的全新游戏。没有州为客户持有相同的游戏。
该问题有3种可能的解决方案:
客户端可以在猜测之间保持与服务器的连接。因此,当客户端最初连接时,将选择随机数,并且当进行多次猜测时,客户端和服务器将保持连接。这就是@jowierun试图让你做的事情。
客户端可以选择随机数并每次与服务器进行通信。所以客户端在连接时会写两个整数。但这完全消除了对服务器的需求,这有点荒谬。
服务器可以在猜测之间保持每个客户端的状态。你可以用几种不同的方式做到这一点。服务器可以在Game
中存储与每个客户端IP相关联的Map
。这只适用于每个IP当然有1个客户端的情况。您可以从Socket
获取IP。
一个问题是“超时”游戏。您不希望服务器永远缓存正在运行的游戏。也许每次连接服务器的客户端都可以通过它查看Map
个游戏,然后扔出比某段时间更早的游戏。您需要在游戏中添加createdMillis
字段。
希望这有帮助。
答案 1 :(得分:0)
尝试使用Singleton RandomGame实例
答案 2 :(得分:0)
当服务器启动时,它会使用guessCount创建一个randomGame对象 和随机数
你不这样做......每次客户端连接时都会创建该对象(为客户端处理程序构造函数中的每个客户端创建一个新的RandomGame对象)
您应该将该对象的创建移动到Q4server.main(...)并将其传递给所有客户端处理程序(您必须更改构造函数签名以将其作为参数)
guessCount应该是易变的