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

时间:2018-02-22 19:10:41

标签: java c++ sockets tcp tcpserver

我再次问其中一个问题:P
由于我将我的C ++服务器移植到Java服务器(而且差不多完成了)我只缺少一件事:
发送文件。
我无法解决如何使用Java构造数据包以通过DataOutputStream发送它的方法 在C ++中,我以这种方式准备了数据包(为file_size保留了前4个字节,保留了文件本身):

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 ++代码 提前谢谢!

sendall func:

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;
}

1 个答案:

答案 0 :(得分:2)

该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,并且可能在英特尔处理器上运行,因此结果为LITTLE_ENDIAN,这就是我在上面的代码中指定的原因。但是作为@ paulsm4 said,你应该测试一下。