java多线程和对象

java多线程和对象,java,multithreading,Java,Multithreading,我有三节课。当服务器启动时,它会创建一个带有猜测计数和随机数的randomGame对象。当客户端启动时,它连接到服务器并将数字传递给服务器,以使用猜数方法(使用控制台输入数字)猜出生成的随机游戏的随机数 但是下面的问题。客户端每次输入数字时,guessCount和随机数都会重新初始化(即,随机数不同,guessCount不能递增)。我希望运行的每个客户端程序的随机数相同,并且每次运行guess方法时,guessCount将增加1 public class Game { private i

我有三节课。当服务器启动时,它会创建一个带有猜测计数和随机数的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;
        }
    }
}
这是服务器:

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();
        }
    }