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