Java socket API中的read函数不起作用并且滞后

Java socket API中的read函数不起作用并且滞后,java,serversocket,Java,Serversocket,我做了一个单模式的国际象棋游戏,据我所知没有bug,我开始了多人模式。 在我成功连接两个玩家后,一个窗口服务器玩家窗口工作,但对手窗口滞后于特定的线移动=opponentPlayer.in.readLine;,它没有显示任何错误或任何东西,事实上它停止了窗口的响应,而没有显示任何进度,如图所示 代码: 系统消息: I Entered play Successfully I Entered opponent play, i'm stuck I Entered receiveMovement I E

我做了一个单模式的国际象棋游戏,据我所知没有bug,我开始了多人模式。 在我成功连接两个玩家后,一个窗口服务器玩家窗口工作,但对手窗口滞后于特定的线移动=opponentPlayer.in.readLine;,它没有显示任何错误或任何东西,事实上它停止了窗口的响应,而没有显示任何进度,如图所示

代码:

系统消息:

I Entered play Successfully
I Entered opponent play, i'm stuck
I Entered receiveMovement
I Entered opponentPlayer

Process finished with exit code -1
输入流中的read方法是一个阻塞调用,如上文所述。因此,当程序到达readLine方法时,它将始终等待输入。如果从gui调用此方法,它将停止gui并冻结

解决方案是在另一个线程中执行代码,这样主线程就不会被阻塞。在线程中接收到数据后,您可以通知gui或任何其他类有新的移动或任何其他可用数据。

几件事:

1-不建议使用readLine读取消息,最好发送一个4字节的消息头,例如消息长度,然后只读取内容长度

//outside your loop
    InputStream bytesGet = socket.getInputStream();
    int bufferSize; //length you need to read

        byte[] readData = new byte[BYTES_INDICADORES];
        bytesGet.read(readData);

        bufferSize = ByteBuffer.wrap(readData).getInt();
        readData = new byte[bufferSize];
        int totalRead = bytesGet.read(readData);
        //here send readData
    }
要发送内容消息,请执行以下操作:

byte[] size = new byte[]{
        (byte)(content.getBytes("US-ASCII").length >> 24),
        (byte)(content.getBytes("US-ASCII").length >> 16),
        (byte)(content.getBytes("US-ASCII").length >> 8),
        (byte)(content.getBytes("US-ASCII").length)
    };
socket.getOutputStream().write(size);
//content String
socket.getOutputStream().write(content.getBytes("US-ASCII"));
socket.getOutputStream().flush();

2-看来你的问题出在循环控制读取套接字上

很抱歉回复太晚,我遇到了一些问题,它按预期工作;只有一件事是剩余的,这一读线;没有收到任何我知道的原因,任何想法?可能您在发送字符串末尾没有换行符\n?因为readLine将在读取和返回之前等待一行结束,即使输入流中已经有一些文本。你说得对,我仍然无法使用此readLine发送/接收,我正在尝试你的方法,但我没有完全理解,发送部分似乎与此字节内容混淆。getBytesUS ASCII.length>>24只是为了避免UTF-8字符转换引起的问题。某些字符UTF-8转换为字节,可以是1或2字节。因此,如果以字节为单位度量字符串,则没有长度对应关系。将此与线程结合,必须解决您的问题。
byte[] size = new byte[]{
        (byte)(content.getBytes("US-ASCII").length >> 24),
        (byte)(content.getBytes("US-ASCII").length >> 16),
        (byte)(content.getBytes("US-ASCII").length >> 8),
        (byte)(content.getBytes("US-ASCII").length)
    };
socket.getOutputStream().write(size);
//content String
socket.getOutputStream().write(content.getBytes("US-ASCII"));
socket.getOutputStream().flush();