java多线程和对象

时间:2011-11-29 03:22:03

标签: java multithreading

我有三节课。当服务器启动时,它会创建一个带有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();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

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

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

该问题有3种可能的解决方案:

  1. 客户端可以在猜测之间保持与服务器的连接。因此,当客户端最初连接时,将选择随机数,并且当进行多次猜测时,客户端和服务器将保持连接。这就是@jowierun试图让你做的事情。

  2. 客户端可以选择随机数并每次与服务器进行通信。所以客户端在连接时会写两个整数。但这完全消除了对服务器的需求,这有点荒谬。

  3. 服务器可以在猜测之间保持每个客户端的状态。你可以用几种不同的方式做到这一点。服务器可以在Game中存储与每个客户端IP相关联的Map。这只适用于每个IP当然有1个客户端的情况。您可以从Socket获取IP。

    一个问题是“超时”游戏。您不希望服务器永远缓存正在运行的游戏。也许每次连接服务器的客户端都可以通过它查看Map个游戏,然后扔出比某段时间更早的游戏。您需要在游戏中添加createdMillis字段。

  4. 希望这有帮助。

答案 1 :(得分:0)

尝试使用Singleton RandomGame实例

答案 2 :(得分:0)

你写了

  

当服务器启动时,它会使用guessCount创建一个randomGame对象   和随机数

你不这样做......每次客户端连接时都会创建该对象(为客户端处理程序构造函数中的每个客户端创建一个新的RandomGame对象)

您应该将该对象的创建移动到Q4server.main(...)并将其传递给所有客户端处理程序(您必须更改构造函数签名以将其作为参数)

guessCount应该是易变的