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