java多线程和对象
我有三节课。当服务器启动时,它会创建一个带有猜测计数和随机数的randomGame对象。当客户端启动时,它连接到服务器并将数字传递给服务器,以使用猜数方法(使用控制台输入数字)猜出生成的随机游戏的随机数 但是下面的问题。客户端每次输入数字时,guessCount和随机数都会重新初始化(即,随机数不同,guessCount不能递增)。我希望运行的每个客户端程序的随机数相同,并且每次运行guess方法时,guessCount将增加1java多线程和对象,java,multithreading,Java,Multithreading,我有三节课。当服务器启动时,它会创建一个带有猜测计数和随机数的randomGame对象。当客户端启动时,它连接到服务器并将数字传递给服务器,以使用猜数方法(使用控制台输入数字)猜出生成的随机游戏的随机数 但是下面的问题。客户端每次输入数字时,guessCount和随机数都会重新初始化(即,随机数不同,guessCount不能递增)。我希望运行的每个客户端程序的随机数相同,并且每次运行guess方法时,guessCount将增加1 public class Game { private i
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;
}
}
}
这是服务器:
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();
}
}
}
您的问题是
ClientHandler.run()
方法。在退出之前,它应该循环进行3次(或无论需要多少次)猜测。您的套接字客户端也必须这样做。按照您目前的方式,每次猜测客户机都会分别连接到服务器-没有您需要的“对话”:
public void run() {
try {
final int guessMax = 3;
for (int i=0;i<guessMax;i++) {
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);
dos.flush();
//System.out.println(reply);
//System.out.println(reply);
}
socket.close();
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
public void run(){
试一试{
最终int猜测最大值=3;
对于(int i=0;i尝试使用您编写的Singleton RandomGame实例
当服务器启动时,它会创建一个带有猜测计数的randomGame对象
和随机数
您不会这样做…每次客户端连接时都会创建该对象(在客户端处理程序构造函数中为每个客户端创建一个新的RandomGame对象)
您应该将该对象的创建移动到Q4server.main(…),并将其传递给所有客户端处理程序(您必须更改构造函数签名以将其作为参数)
虽然@DarkSquirrel42和@jowierun是正确的,但猜测计数应该是不稳定的,我想进一步介绍他们的答案,并提供另一种选择
现在,客户端连接,创建一个新游戏,他们提供猜测,服务器回复并断开连接。当客户端再次连接时,他们将获得一个带有新随机数的全新游戏。没有任何状态为客户端保留相同的游戏
该问题有3种可能的解决方案:
客户端可以在猜测之间保持与服务器的连接。因此,当客户端最初连接时,将选择随机数,并且在进行多次猜测时,客户端和服务器将保持连接。这就是@jowierun试图让您做到的
客户机可以选择随机数,并在每次与服务器进行通信。因此,客户机在连接时会写入两个整数。但这完全消除了对服务器的需要,这有点荒谬
服务器可以在猜测之间保存每个客户端的状态。您可以通过两种不同的方式执行此操作。服务器可以将与每个客户端的IP相关联的游戏存储在映射中。当然,这只会在每个IP有一个客户端的情况下起作用。您可以从套接字获取IP
一个问题是“超时”游戏。你不希望服务器永远缓存正在运行的游戏。也许每次客户端连接服务器时,服务器都可以查看它的游戏地图,并扔掉那些超过某个时间段的游戏。你需要在游戏中添加createdMillis
字段
希望这有帮助
public void run() {
try {
final int guessMax = 3;
for (int i=0;i<guessMax;i++) {
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);
dos.flush();
//System.out.println(reply);
//System.out.println(reply);
}
socket.close();
} catch(IOException ioe) {
ioe.printStackTrace();
}
}