这是我在猜测游戏中遇到的问题。基本上我想要做的是拥有一台服务器,并有许多客户端连接到它。目前已经完成了我能够将客户端连接到服务器来玩游戏,数字猜谜游戏。问题是我希望每个客户都能够玩游戏。目前,游戏正在服务器本身上播放。因此,虽然多个客户端可以加入,但每次客户端加入时游戏都会再次启动。当输入正确的答案时,服务器会向客户提供他的分数。为了清楚我正在运行服务器类,然后我正在运行客户端类。我希望能够在客户端类窗口而不是服务器窗口上玩游戏。这是我的代码,请你告诉我该怎么做。猜谜游戏源自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();
}
}
}
答案 0 :(得分:1)
在Protocol类中,您将消息写入System.out
。 Protocol
类的实例在服务器的环境中执行,因此输出将打印到服务器的输出。要在客户端控制台中显示输出,您必须通过套接字将消息发送到客户端并在那里打印。
答案 1 :(得分:0)
首先,首要的事情是implement Runnable
instead of extend Thread
。这并不一定能解决你的问题。
现在,令人困惑的是你真正想要实现的目标。您说您希望多个客户端玩游戏,但现在连接到服务器的每个客户端都会启动一个新游戏。我认为这是正确的方法,但你似乎想要一个游戏实例和多个客户端同时玩它。这是违反直觉的,但是如果您只是创建GProtocol
类的单个实例,将其传递给多个客户端并使用synchronize
关键字来确保线程安全访问其数据,则可以实现它。