Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP服务器以数据包结构发送文件(到非Java客户端)_Java_C++_Sockets_Tcp_Tcpserver - Fatal编程技术网

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

TCP服务器以数据包结构发送文件(到非Java客户端),java,c++,sockets,tcp,tcpserver,Java,C++,Sockets,Tcp,Tcpserver,我再问一次这样的问题:p 因为我把我的C++服务器移植到java服务器上(而且几乎已经完成了),我只缺一件事: 正在发送文件。 我不知道如何用Java构造数据包,通过DataOutputStream发送数据包。 在C++中,我用这种方式准备了数据包(为文件大小保留了4字节,其余文件本身): 我希望您能在这里帮助我,我能够构造简单的数据包,但这一个让我头疼:p 在java X.xBR>中,我是否合并字节或C++如何实现代码? 提前谢谢 发送所有函数: int sendall(TCPStream *

我再问一次这样的问题:p
因为我把我的C++服务器移植到java服务器上(而且几乎已经完成了),我只缺一件事:
正在发送文件。
我不知道如何用Java构造数据包,通过DataOutputStream发送数据包。
在C++中,我用这种方式准备了数据包(为文件大小保留了4字节,其余文件本身):

我希望您能在这里帮助我,我能够构造简单的数据包,但这一个让我头疼:p
在java X.xBR>中,我是否合并字节或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;
}
int sendall(TCPStream*s,char*buf,int*len)
{
int-total=0;
int字节左=*len;
int n;
而(总计<*len)
{
n=s->send(基本单位+总计,字节左);
如果(n==-1)中断;
总+=n;
字节左-=n;
}
*len=总数;
返回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
,并且很可能在英特尔处理器上运行,因此结果是
LITTLE_ENDIAN
,这就是我在上面的代码中指定的原因。但是,作为@paulsm4,您应该对此进行测试。

该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,您应该对此进行测试。

那么问题是什么?发送4个字节,大小为文件内容的所有字节。您是否在询问如何发送具有右端的4字节大小?你使用的是 DATaOutPoStuts,它首先发送了带有高字节的<代码> int <代码>值,所以如果C++是这样做的,那么调用<代码>写(int v)<代码>,后面跟着<代码>写(字节[] b,int Of,int LeN)< /C>。如果C++首先发送低字节,那么为什么使用“代码>数据输出流< /COD>”?因为移植了,可能不关心C++注释,但是,从<代码>字符数组>数据()(代码)>代码> pDATA<代码>有什么意义?看起来您可以保存一个步骤和
memcpy((char*)(packet+4)、charArray.data()、文件大小)
或省去很多麻烦,分别发送
文件大小
,然后发送
charArray.data()
。TCP是一个流,因此除非您在
sendall
中添加了额外的协议头,否则您决定什么是数据包并不重要。TCP将以它想要的任何大小/形状的blob发送您的消息。
sendall
做什么?如果它只是一个标准套接字写入的薄包装,那么您可以将所有工作减少到一个
DataOutputStream
、一个调用
writeInt
和一个调用
write
。如果没有
sendall
的代码或猜测,就无法回答问题。传输
文件大小时要注意endian。Java总是说big-endian,除非你让它这样做。C++可以说是硬件的原生代码,C++代码可以简化为<代码> SDENALL(流、(char *)和文件大小、sieZof(文件大小));sendall(流,charArray.data(),文件大小)。再次注意endian并确保
int
为32位。那么问题是什么?发送4个字节,大小为文件内容的所有字节。您是否在询问如何发送具有右端的4字节大小?你使用的是 DATaOutPoStuts,它首先发送了带有高字节的<代码> int <代码>值,所以如果C++是这样做的,那么调用<代码>写(int v)<代码>,后面跟着<代码>写(字节[] b,int Of,int LeN)< /C>。如果C++首先发送低字节,那么为什么使用“代码>数据输出流< /COD>”?因为移植了,可能不关心C++注释,但是,从<代码>字符数组>数据()(代码)>代码> pDATA<代码>有什么意义?看起来您可以保存一个步骤和
memcpy((char*)(packet+4)、charArray.data()、文件大小)
或省去很多麻烦,分别发送
文件大小
,然后发送
charArray.data()
。TCP是一个流,因此除非您在
sendall
中添加了额外的协议头,否则您决定什么是数据包并不重要。TCP将以它想要的任何大小/形状的blob发送您的消息。
sendall
做什么?如果它只是一个标准套接字写入的薄包装,那么您可以将所有工作减少到一个
DataOutputStream
、一个调用
writeInt
和一个调用
write
。如果没有
sendall
的代码或猜测,就无法回答问题。传输
文件大小时要注意endian。Java总是说big-endian,除非你让它这样做。C++可以说是硬件的原生代码,C++代码可以简化为<代码> SDENALL(流、(char *)和文件大小、sieZof(文件大小));sendall(流,charArray.data(),文件大小)。再次注意endian并确保
int
为32位。关于:套接字“网络顺序”和Java字节顺序都是。大多数主机都是英特尔CPU()。原来的C++代码只是“发送字节”(没有或等效)。因此,尽管上面的代码应该可以工作。。。我肯定会测试它。原始代码应该使用
htonl()
表示“文件大小”…@paulsm4您是对的,大多数主机都是Intel,因此
LITTLE\u ENDIAN
,由于C代码刚刚编写了
int
值,我将答案改为