将文件作为块从 java 客户端发送到服务器

Sending file as chunks from a java client to server

我写了一个 java 客户端,它将字节数组的 buffer_size 作为命令行参数,并声明一个字节数组,其中的文件将被读取并发送到服务器块。客户端在开始读取文件之前会发送 buffer_size 到 java 服务器,这样服务器也可以定义一个字节数组来接收文件块。所以这个机制看起来像....

客户端:

while ((count = fileReader.read(bytes)) > 0) {
    toServer.write(bytes, 0, count);
}

服务器端:

while ((count = fromClient.read(bytes)) > 0) {
   //process the received file content
}

这很适合我。但是服务器读取块的行为以随机方式变化。即,如果客户端要读取的文件是 3000 字节,如果 buffer_size 是 8192 字节(服务器也将具有 8192 的 buffer_size),则服务器读取整个块(从客户端)通过单个 read() 操作,有时块被分成两部分并读取(例如两个 1500 字节,占用 2 个 read() 操作)。我不明白这里到底发生了什么。我们能否以服务器不分割客户端发送的块的方式实现这一点?!

当运行客户端和服务器在本地机器上测试时,服务器使用一次write()操作读取客户端发送的全部内容,只用一次read()操作。仅当客户端和服务器位于不同机器上时才会发生行为更改。

1500 可能是 link 的 MTU。数据在传输时被分成大小相同的数据包。实现服务器时,您必须简单地准备好将数据切成任意大小的数据包。

TCP 实现的抽象是一个字节流,而不是一系列的 write() 调用。要强制使用特定的数据包大小,您必须使用 UDP(并处理数据包丢失,因为 UDP 不保证交付)。

要解决此问题,只需循环读取直到读取整个缓冲区或达到文件长度。客户端可以简单地在协议的开头发送文件的长度。客户端和服务器不需要使用相同的缓冲区大小。