我的套接字 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 有可用的新着法(或任何其他数据)。