Java服务器猜测游戏 - 多个客户端问题

时间:2012-12-19 15:35:20

标签: java multithreading

这是我在猜测游戏中遇到的问题。基本上我想要做的是拥有一台服务器,并有许多客户端连接到它。目前已经完成了我能够将客户端连接到服务器来玩游戏,数字猜谜游戏。问题是我希望每个客户都能够玩游戏。目前,游戏正在服务器本身上播放。因此,虽然多个客户端可以加入,但每次客户端加入时游戏都会再次启动。当输入正确的答案时,服务器会向客户提供他的分数。为了清楚我正在运行服务器类,然后我正在运行客户端类。我希望能够在客户端类窗口而不是服务器窗口上玩游戏。这是我的代码,请你告诉我该怎么做。猜谜游戏源自java sun knock knock教程。在此处找到http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html 感谢。

客户等级

import java.io.*;
import java.net.*;

public class GClient {
public static void main(String[] args) throws IOException {

    Socket kkSocket = null;
    PrintWriter out = null;
    BufferedReader in = null;

    try {
        kkSocket = new Socket("127.0.0.1", 4444);
        out = new PrintWriter(kkSocket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
    } catch (UnknownHostException e) {
        System.err.println("Don't know about host: taranis.");
        System.exit(1);
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for the connection to: taranis.");
        System.exit(1);
    }

    BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
    String fromServer;
    String fromUser;

    while ((fromServer = in.readLine()) != null) {
        System.out.println("Server: " + fromServer);
        if (fromServer.equals("Bye."))
            break;

        fromUser = stdIn.readLine();
    if (fromUser != null) {
            System.out.println("Client: " + fromUser);
            out.println(fromUser);
    }
    }

    out.close();
    in.close();
    stdIn.close();
    kkSocket.close();
}
}

服务器类

 import java.net.*;
 import java.io.*;

public class GServer {
public static void main(String[] args) throws IOException {
    ServerSocket serverSocket = null;
    boolean listening = true;

    try {
        serverSocket = new ServerSocket(4444);
    } catch (IOException e) {
        System.err.println("Could not listen on port: 4444.");
        System.exit(-1);
    }
    System.err.println("Started KK server listening on port 4040");
    while (listening)
    new GThread(serverSocket.accept()).start();

    serverSocket.close();
}
}

协议类

import java.util.*;


public class GProtocol {
int guess = 0, number = new Random().nextInt(100) + 1;
int score = 10;
int guessmade = 0;
boolean gameRunning = true;
Scanner scan = new Scanner(System.in);


public String processInput(String theInput) {
    String theOutput = null;


    String ID;
    System.out.println("Please Enter your ID...");
    ID = scan.next( );

    System.out.println("Please guess the number between 1 and 100. You have 10 guesses. Your score is however many guesses you have left");

    while (guess != number)
    {

        try {


        if ((guess = Integer.parseInt(scan.nextLine())) != number) {

          System.out.println(guess < number ? "Higher..."  : "Lower...");
          score = score - 1; // here the score variable has one value taken away form it each time the user misses a guess
          guessmade = +1; // here the guess made variable is given +1 variable
        }
        else {
          System.out.println("Correct!");


        }

        }



      catch (NumberFormatException e) {
        System.out.println("Please enter valid numbers! '");

      }   






    }   


    theOutput = ID + "  your score is " + score ; // here the score is returned

    return theOutput;}}

线程类

import java.net.*;
import java.io.*;

public class GThread extends Thread {
private Socket socket = null;

public GThread(Socket socket) {
super("GMultiServerThread");
this.socket = socket;
}

public void run() {

try {
    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(
                new InputStreamReader(
                socket.getInputStream()));

    String inputLine, outputLine;
   GProtocol kkp = new GProtocol();
    outputLine = kkp.processInput(null);
    out.println(outputLine);

    while ((inputLine = in.readLine()) != null) {
    outputLine = kkp.processInput(inputLine);
    out.println(outputLine);
    if (outputLine.equals("Bye"))
        break;
    }
    out.close();
    in.close();
    socket.close();

} catch (IOException e) {
    e.printStackTrace();
}
}
}

2 个答案:

答案 0 :(得分:1)

在Protocol类中,您将消息写入System.outProtocol类的实例在服务器的环境中执行,因此输出将打印到服务器的输出。要在客户端控制台中显示输出,您必须通过套接字将消息发送到客户端并在那里打印。

答案 1 :(得分:0)

首先,首要的事情是implement Runnable instead of extend Thread。这并不一定能解决你的问题。

现在,令人困惑的是你真正想要实现的目标。您说您希望多个客户端玩游戏,但现在连接到服务器的每个客户端都会启动一个新游戏。我认为这是正确的方法,但你似乎想要一个游戏实例和多个客户端同时玩它。这是违反直觉的,但是如果您只是创建GProtocol类的单个实例,将其传递给多个客户端并使用synchronize关键字来确保线程安全访问其数据,则可以实现它。