2012-12-19 174 views
0

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

客户端类

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

Thread类

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

你在“客户端窗口”中的含义是什么? ...我明白了。当然,您必须将消息发送给客户端(通过套接字),而不是发送给System.out。 – Fildor

回答

1

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

+0

啊,我完全错过了OP想要做的事情。 – Kiril

+0

没关系。直到我看到那些“System.out.println”时,我也遇到了问题 – Fildor

0

首先,首选的是implementRunnable instead of extendThread。这并不一定能解决你的问题。

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