【发布时间】:2017-07-18 00:49:49
【问题描述】:
我对我希望客户端如何按顺序与服务器通信感到困惑。例如,我正在创建一个多人井字游戏,其中 2 个客户端将连接到游戏服务器。然后客户轮流输入 x 的坐标。但是,当我在我的 while 循环中使用 break 时,它只允许它们进入一次,然后断开套接字。我该怎么做才能让客户端在其他客户端回答时暂时被阻止?
编辑:我不打算为此目的使用多线程。
服务器(为阅读目的而截断):
try {
while (true) {
System.out.println("Awaiting connection!");
Socket clientSocket = server.accept();
System.out.println("Player " + noOfPlayers + " has connected!");
noOfPlayers ++;
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
while (!newGame.checkWinner()) {
out.println(newGame.currentPlayer());
input = in.readLine();
x = Integer.parseInt(input.split("\\,+")[0]);
y = Integer.parseInt(input.split("\\,+")[1]);
newGame.addPoint(x, y);
out.println("Moved");
if (newGame.checkWinner()) {
System.out.println("The winner is " + newGame.currentPlayer());
out.println("The winner is " + newGame.currentPlayer());
server.close();
break;
}
else if (newGame.boardFilledUp()) {
newGame.loadBoard();
out.println("It's a draw!");
server.close();
break;
}
newGame.loadBoard();
newGame.changePlayer();
break;
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
客户端(为阅读目的而截断):
while (true) {
PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true);
// Read input from server
BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
// Read input from client
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter your coordinates in x,y form: ");
String userInput;
char serverOutput;
serverOutput = in.readLine().charAt(0);
System.out.println("Current player is " + serverOutput);
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("You sent: " + userInput);
}
break;
}
【问题讨论】:
-
您只需告诉您的客户“等待对方移动”。
-
@BalazsVago 你的意思是让客户端检查是否有来自服务器的字符串确认?
-
始终从服务器端控制游戏,让任何从客户端控制的东西都可能导致“作弊”:)。是的,让客户端点击任意位置,但让客户端知道服务器的想法。
-
是的,我的游戏功能在服务器端运行!目前它是 tic tac toe 的控制台版本。我已经在问题中添加了我的代码,所以也许你可以帮我看看?如果我没记错的话,我认为这与 readLines() 方法有关。
-
为什么在翻转玩家之后就打破游戏主循环?!
标签: java sockets networking server client