将文件作为块从 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 不保证交付)。
要解决此问题,只需循环读取直到读取整个缓冲区或达到文件长度。客户端可以简单地在协议的开头发送文件的长度。客户端和服务器不需要使用相同的缓冲区大小。
我写了一个 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 不保证交付)。
要解决此问题,只需循环读取直到读取整个缓冲区或达到文件长度。客户端可以简单地在协议的开头发送文件的长度。客户端和服务器不需要使用相同的缓冲区大小。