Java TCP消息发送出错(发送5700个字符的消息后缺少约1700个字符)

Java TCP消息发送出错(发送5700个字符的消息后缺少约1700个字符),java,Java,在我的TCPClient类中,当我发送消息时,我最终丢失了最后1700个字符。我把范围缩小到我的数学搞砸了。我不知怎的告诉它,这是最后一条信息太早了 简而言之。最后我只漏掉了最后1700个字符 (writeEOF()告诉服务器它是当前包的结尾) 我的代码: 在循环中有writeEOF这一事实并不理想。。。但是,我们不知道这个方法,或者说writeHeader,是做什么的……writeEOF在循环内外都被调用。如果它写入文件的结尾,它可能不应该在循环中。所有的+1和-1也是奇数。您只需执行一次,例

在我的TCPClient类中,当我发送消息时,我最终丢失了最后1700个字符。我把范围缩小到我的数学搞砸了。我不知怎的告诉它,这是最后一条信息太早了

简而言之。最后我只漏掉了最后1700个字符

writeEOF()
告诉服务器它是当前包的结尾)

我的代码:
在循环中有
writeEOF
这一事实并不理想。。。但是,我们不知道这个方法,或者说
writeHeader
,是做什么的……writeEOF在循环内外都被调用。如果它写入文件的结尾,它可能不应该在循环中。所有的+1和-1也是奇数。您只需执行一次,例如调整的缓冲区大小=缓冲区大小-1;我会删除
Array.copyOfRange
的所有用法,这只会使您的代码更慢、更复杂。注意
write(byte[])
调用
write(byte[],offset,length)
感谢您的评论。我一直很感激能得到关于更好的编码风格的提示@JonSkeet我刚刚添加了writeHeader和writeEOF方法。在不知道EOF是什么,也不知道header.toBytes()的作用,或者预期的协议是什么的情况下,这仍然不是真正足够的信息……在循环中有
WriteOf
的事实并不理想。。。但是,我们不知道这个方法,或者说
writeHeader
,是做什么的……writeEOF在循环内外都被调用。如果它写入文件的结尾,它可能不应该在循环中。所有的+1和-1也是奇数。您只需执行一次,例如调整的缓冲区大小=缓冲区大小-1;我会删除
Array.copyOfRange
的所有用法,这只会使您的代码更慢、更复杂。注意
write(byte[])
调用
write(byte[],offset,length)
感谢您的评论。我一直很感激能得到关于更好的编码风格的提示@JonSkeet我刚刚添加了writeHeader和writeEOF方法。在不知道EOF是什么,或者
header.toBytes()是什么,或者预期的协议是什么的情况下,仍然没有足够的信息。。。
public final void writeString(String out) throws IOException {
    byte[] bytes = out.getBytes();
    int numOfMessages = bytes.length / (BUFFER_SIZE - 1);

    if (bytes.length > BUFFER_SIZE - 1) {
        for (int i = 0; i < numOfMessages; i++) {
            writeHeader(new RequestHeader(clientId, getNextRequestId(),
                    RequestCommand.SEND_DATA, false, // false tells it that it is not the last message.
                    (byte)(i + 1)));
            output.write(bytes, i * (BUFFER_SIZE - 1),
                    (BUFFER_SIZE - 1)
            ));
            writeEOF(); // tells the server to return the current buffer, and expect a new message. While it is not the last message, it just appends the buffered message to a StringBuilder
            RequestHeader header = handleHeader();
            if (header == null || header.getRequestCommand() != RequestCommand.ACK) {
                throw new IOException("Failed to send message: " + lastRequestId);
            }
        }
        writeHeader(new RequestHeader(clientId, getNextRequestId(), RequestCommand.SEND_DATA, true, (byte) (numOfMessages)));
        output.write(bytes, numOfMessages * (BUFFER_SIZE - 1), bytes.length - (numOfMessages * (BUFFER_SIZE - 1)));
        writeEOF();
        RequestHeader header = handleHeader();
        if (header == null || header.getRequestCommand() != RequestCommand.ACK) {
            throw new IOException("Failed to send message: " + lastRequestId);
        }
    } else {
        writeHeader(new RequestHeader(clientId, getNextRequestId(),
                RequestCommand.SEND_DATA, (byte) 0));
        output.write(bytes);
        writeEOF();
        RequestHeader header = handleHeader();
        if (header == null || header.getRequestCommand() != RequestCommand.ACK) {
            throw new IOException("Failed to send message");
        }
    }
}
private void writeHeader(RequestHeader header) throws IOException {
    output.write(header.toBytes());
}

private void writeEOF() throws IOException {
    output.write(EOF);
}