每当我阅读传入消息的一部分时,插座都会清洁缓冲区的一部分



我已经开始使用Java和套接字,并且我在 datainputstream 上遇到了一些问题。我收到的电报包含消息本身的前4个字节中的消息长度,因此在第一次迭代时,我刚刚阅读了此内存部分。当我再次阅读传入的消息时,我注意到第一个字节已经消失了,因此我需要在创建的方法中减去这4个字节以计算消息长度本身。问题是:传入数据的缓冲区是否丢失了我已经阅读的字节?我在Java文档中找不到任何东西,但是由于我的经验不足,我可能会缺少任何东西。

这是数据读数的方法:

/**
 * It receives data from a socket.
 *
 * @param socket The communication socket.
 * @param lengthArea The area of the header containing the length of the message to be received.
 * @return The received data as a string.
 */
 static String receiveData(Socket socket, int lengthArea) {
    byte[] receivedData = new byte[lengthArea];
    try {
        DataInputStream dataStream = new DataInputStream(socket.getInputStream());
        int bufferReturn = dataStream.read(receivedData, 0, lengthArea);
        System.out.println("Read Data: " + bufferReturn);
    } catch (IOException e) {
        // Let's fill the byte array with '-1' for debug purpose.
        Arrays.fill(receivedData, (byte) -1);
        System.out.println("IO Exception.");
    }
    return new String(receivedData);
}

这是我用来计算消息长度的方法:

/**
 * It converts the message length from number to string, decreasing the calculated length by the size of the message
 * read in the header. The size is defined in 'Constants.java'.
 *
 * @param length The message size.
 * @return The message size as an integer.
 */
static int calcLength(String length) {
    int num;
    try {
        num = Integer.parseInt(length) + 1 - MESSAGE_LENGTH_AREA_FROM_HEADER;
    } catch (Exception e) {
        num = -1;
    }
    return num;
}

常量。Java

MESSAGE_LENGTH_AREA_FROM_HEADER = 4;

传入数据的缓冲区失去了我已经阅读的字节

是的,当然可以。TCP呈现一个字节流。您消耗的一部分,它消失了。与从文件中读取没有什么不同。

如果在二进制中,您应该使用 DataInputStream.readInt()读取长度单词,然后读取 DataInputStream.readFully()来读取数据。

相关内容

  • 没有找到相关文章

最新更新