【发布时间】:2015-05-27 08:00:56
【问题描述】:
我正在尝试使用 Java SocketsAPI 传输大于 4gb 的文件。我已经通过 InputStreams 读取它并通过 OutputStreams 写入它。但是,在 Wireshark 中分析传输的数据包时,我意识到 TCP 数据包的序列号会增加数据包的字节长度,这似乎是 1440 字节。
这导致当我尝试发送大于 4gb 的文件时,超出 TCP 的 Sequence-Number 字段的总大小,导致大量错误包,但在 Java 中没有错误。
我的传输代码目前如下所示:
DataOutputStream fileTransmissionStream = new DataOutputStream(transmissionSocket.getOutputStream());
FileInputStream fis = new FileInputStream(toBeSent);
int totalFileSize = fis.available();
fileTransmissionStream.writeInt(totalFileSize);
while (totalFileSize >0){
if(totalFileSize >= FileTransmissionManagementService.splittedTransmissionSize){
sendBytes = new byte[FileTransmissionManagementService.splittedTransmissionSize];
fis.read(sendBytes);
totalFileSize -= FileTransmissionManagementService.splittedTransmissionSize;
} else {
sendBytes = new byte[totalFileSize];
fis.read(sendBytes);
totalFileSize = 0;
}
byte[] encryptedBytes = DataEncryptor.encrypt(sendBytes);
/*byte[] bytesx = ByteBuffer.allocate(4).putInt(encryptedBytes.length).array();
fileTransmissionStream.write(bytesx,0,4);*/
fileTransmissionStream.writeInt(encryptedBytes.length);
fileTransmissionStream.write(encryptedBytes, 0, encryptedBytes.length);
在这种情况下我到底做错了什么,或者无法通过一个 Socket 传输大于 4gb 的文件?
【问题讨论】:
-
您知道
FileInputStream.available()不是文件的总长度,对吧?