我的套接字 API 中的读取功能不起作用并且滞后
the read function in my socket API does not work and lags
据我所知,我制作了一个没有错误的单人模式国际象棋游戏,然后我开始了多人游戏模式。
在我成功连接两个播放器后,一个 window(服务器播放器 window)工作但对手 window 落后于特定线 "movement = opponentPlayer.in.readLine();"
,它没有显示任何错误或任何内容全部,事实上它阻止了 window 的响应而不显示任何进展,如图 here
代码:
private void receiveMovement() throws IOException {
System.out.println("I Entered receiveMovement");
String movement = null;
if (serverPlayer != null) {
System.out.println("I Entered serverPlayer");
movement = serverPlayer.in.readLine();
board.whiteTurn = movement.charAt(4) == 1;
} else if (opponentPlayer != null) {
System.out.println("I Entered opponentPlayer");
movement = opponentPlayer.in.readLine();
board.whiteTurn = movement.charAt(4) == 1;
}
System.out.println(movement);
// int yAxis1 = movement.charAt(0) -'a';
// int yAxis2 = movement.charAt(2) -'a';
// System.out.println(yAxis1);
// System.out.println(yAxis2);
// Coordinate sourceCoordinate = new Coordinate(movement.charAt(1), yAxis1); //not sure of the order
// Coordinate destinationCoordinate = new Coordinate(movement.charAt(3), yAxis2);
assert movement != null;
Coordinate sourceCoordinate = new Coordinate(movement.charAt(1), movement.charAt(0) - 'a');
Coordinate destinationCoordinate = new Coordinate(movement.charAt(3), movement.charAt(2) - 'a');
sourceTile = board.getTile(sourceCoordinate);
destinationTile = board.getTile(destinationCoordinate);
}
系统消息:
I Entered play Successfully
I Entered opponent play, i'm stuck
I Entered receiveMovement
I Entered opponentPlayer
Process finished with exit code -1
输入流中的 read
方法是阻塞调用(如 in the api 所述)。因此,一旦到达 readLine()
方法,您的程序将始终等待输入。如果从 gui 调用此方法,它将停止 gui 并冻结。
一个解决方案是在另一个 thread 中执行您的代码,这样主线程就不会被阻塞。在线程中收到数据后,您可以通知 gui 或任何其他 class 有可用的新着法(或任何其他数据)。
据我所知,我制作了一个没有错误的单人模式国际象棋游戏,然后我开始了多人游戏模式。
在我成功连接两个播放器后,一个 window(服务器播放器 window)工作但对手 window 落后于特定线 "movement = opponentPlayer.in.readLine();"
,它没有显示任何错误或任何内容全部,事实上它阻止了 window 的响应而不显示任何进展,如图 here
代码:
private void receiveMovement() throws IOException {
System.out.println("I Entered receiveMovement");
String movement = null;
if (serverPlayer != null) {
System.out.println("I Entered serverPlayer");
movement = serverPlayer.in.readLine();
board.whiteTurn = movement.charAt(4) == 1;
} else if (opponentPlayer != null) {
System.out.println("I Entered opponentPlayer");
movement = opponentPlayer.in.readLine();
board.whiteTurn = movement.charAt(4) == 1;
}
System.out.println(movement);
// int yAxis1 = movement.charAt(0) -'a';
// int yAxis2 = movement.charAt(2) -'a';
// System.out.println(yAxis1);
// System.out.println(yAxis2);
// Coordinate sourceCoordinate = new Coordinate(movement.charAt(1), yAxis1); //not sure of the order
// Coordinate destinationCoordinate = new Coordinate(movement.charAt(3), yAxis2);
assert movement != null;
Coordinate sourceCoordinate = new Coordinate(movement.charAt(1), movement.charAt(0) - 'a');
Coordinate destinationCoordinate = new Coordinate(movement.charAt(3), movement.charAt(2) - 'a');
sourceTile = board.getTile(sourceCoordinate);
destinationTile = board.getTile(destinationCoordinate);
}
系统消息:
I Entered play Successfully
I Entered opponent play, i'm stuck
I Entered receiveMovement
I Entered opponentPlayer
Process finished with exit code -1
输入流中的 read
方法是阻塞调用(如 in the api 所述)。因此,一旦到达 readLine()
方法,您的程序将始终等待输入。如果从 gui 调用此方法,它将停止 gui 并冻结。
一个解决方案是在另一个 thread 中执行您的代码,这样主线程就不会被阻塞。在线程中收到数据后,您可以通知 gui 或任何其他 class 有可用的新着法(或任何其他数据)。