我有三节课。服务器启动时,它将创建一个带有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
字段。
希望这可以帮助。