gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:36:50 25 4
gpt4 key购买 nike

我又问了其中一个问题: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 said ,你应该测试一下。

关于java - TCP 服务器以数据包结构发送文件(到非 Java 客户端),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48935429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com