TCP 服务器以数据包结构发送文件(到非 Java 客户端)

TCP-Server sending a file in a packet structure (to a non Java client)

我又问了其中一个问题:P
由于我正在将我的 C++ 服务器移植到 Java 服务器(并且快完成了),所以我只遗漏了一件事:
正在发送文件。
我不知道如何在 Java 中构造数据包以通过 DataOutputStream 发送它。
在 C++ 中,我以这种方式准备数据包(前 4 个字节为 file_size 保留,剩下的是文件本身):

char *pData = new char[file_size];

memcpy(pData, charArray.data(), file_size);

char *packet = new char[file_size + 4];
memset(packet, 0, file_size + 4);

*(int*)(packet) = file_size;
memcpy((char*)(packet + 4), pData, file_size);

int r = file_size + 4;
sendall(stream, packet, &r);

我希望你能帮我解决这个问题,我可以构建简单的数据包,但是这个让我很头疼:P
我要合并字节还是如何在 Java x..x
中完成 C++ 代码 提前致谢!

发送函数:

int sendall(TCPStream *s, char *buf, int *len)
{
    int total = 0;
    int bytesleft = *len;
    int n;

    while(total < *len)
    {
        n = s->send(buf+total, bytesleft);
        if (n == -1) break;
        total += n;
        bytesleft -= n;
    }

    *len = total;

    return n ==-1 ? -1 : 0;
}

该 C 代码的 Java 等价物是:

int file_size = ...;
byte[] file_data = ...;

byte[] packet = new byte[file_size + 4];
ByteBuffer.wrap(packet).order(ByteOrder.LITTLE_ENDIAN).putInt(file_size);
System.arraycopy(file_data, 0, packet, 4, file_size);

您需要确认文件大小是先高字节还是低字节发送,如果需要则更改为BIG_ENDIAN

由于 C 代码刚刚将文件大小添加为 int,并且在 Intel 处理器上很可能是 运行,结果是 LITTLE_ENDIAN,这就是我在上面的代码中指定的原因.但是作为@paulsm4 ,你应该测试一下。