最近遇到个网络通信的问题,协议如下采用TCP长连接,每个消息包含:1、二进制包头;2、包内容(xml格式)。
HeardFlag(int) Length(int) Sequence Ver Enc Rec
4 4 4 1 1 2
我想用indy的idTCPClient 和idTCPServer 来接收和发送数据,我的想法是包头用个结构体,内容是把xml转化成文件流,现在不知道怎么把包头和内容一起发送出去,求高手解惑,第一次做这个TCP通信的东西。
HeardFlag(int) Length(int) Sequence Ver Enc Rec
4 4 4 1 1 2
我想用indy的idTCPClient 和idTCPServer 来接收和发送数据,我的想法是包头用个结构体,内容是把xml转化成文件流,现在不知道怎么把包头和内容一起发送出去,求高手解惑,第一次做这个TCP通信的东西。
结构体可以添加其它成员存放其它的信息,传输数据就把这个结构体发送出去即可type
TRec=record
Header:array of Byte;
XML:TFileStream; //或TMemoryStream
end;
第二种: 发2次发过去, 第一次发头, 第二次发包内容不管对于第一种还是第二种, 你都需要有自己的包处理过程, 也就是所谓的应用层通信协议 用来处理粘包的问题, 比如对方收到完整的消息包后才处理数据.
to :Hexpate 假如我是第一种发送方式,我是先把包内容放到一个MemoryStream里,然后在用一个指针变量指向这个stream,在把这个指针当参数发送过去吗,
还有,我接收到这个包的时候,怎么把这个指针里的内容分拆成包头和包内容呢,能不能简单的写个例子,我不知道如何按上面的协议读出内容。
你写错了吧, 你要知道 array of byte是动态数组, 存储的是指针, 这样直接把结构体发出去, 对方收到的是指针, 而不是内容. 你不写清楚, 我担心别人看到照抄就完了.
例子你到codeproject上找delphi相关的通讯程序
{
unsigned char start;
unsigned char flag;
unsigned char cmd;
unsigned char len;
unsigned char data[BUFSIZE];
} tagPacketItem;
len=0没数据,如果你的数据比较大在接收端还是判断下接收的返回值
PRec=^TRec;
TRec= record //用结构体存包信息
HardFlag:shortstring;
Length:integer;
Sequence:integer;
Ver:byte;
Enc:byte;
Rec:WideChar;
XML:TFileStream;
end;