最近遇到个网络通信的问题,协议如下采用TCP长连接,每个消息包含:1、二进制包头;2、包内容(xml格式)。
HeardFlag(int) Length(int) Sequence Ver Enc Rec
4               4 4            1    1    2
我想用indy的idTCPClient 和idTCPServer 来接收和发送数据,我的想法是包头用个结构体,内容是把xml转化成文件流,现在不知道怎么把包头和内容一起发送出去,求高手解惑,第一次做这个TCP通信的东西。

解决方案 »

  1.   

    结构体可以定义文件流或者内存流;
    结构体可以添加其它成员存放其它的信息,传输数据就把这个结构体发送出去即可type
      TRec=record
        Header:array of Byte;
        XML:TFileStream; //或TMemoryStream
     end;
      

  2.   

    第一种: 简单点, 直接创建一个MemoryStream, 然后把头和包内容都写进去, 然后直接发这个MemoryStream的Memory指针里的内容.
    第二种: 发2次发过去, 第一次发头, 第二次发包内容不管对于第一种还是第二种, 你都需要有自己的包处理过程, 也就是所谓的应用层通信协议 用来处理粘包的问题, 比如对方收到完整的消息包后才处理数据.
      

  3.   

    to :kaikai_kk        感谢你的回复,简单明了。
    to :Hexpate 假如我是第一种发送方式,我是先把包内容放到一个MemoryStream里,然后在用一个指针变量指向这个stream,在把这个指针当参数发送过去吗,
    还有,我接收到这个包的时候,怎么把这个指针里的内容分拆成包头和包内容呢,能不能简单的写个例子,我不知道如何按上面的协议读出内容。
      

  4.   


    你写错了吧, 你要知道 array of byte是动态数组, 存储的是指针, 这样直接把结构体发出去, 对方收到的是指针, 而不是内容. 你不写清楚, 我担心别人看到照抄就完了.
      

  5.   


    例子你到codeproject上找delphi相关的通讯程序
      

  6.   

    typedef struct 
    {
    unsigned char start;
    unsigned char flag;
    unsigned char cmd;
    unsigned char len;
    unsigned char data[BUFSIZE];
    } tagPacketItem;
    len=0没数据,如果你的数据比较大在接收端还是判断下接收的返回值
      

  7.   

    你看我这样定义包的内容,怎样把这个结构体传过去呢,另外接收是其他公司的程序来做的,他们可能会按协议规定的去截包里的内容,这样传输另一方能正确读出来吗
      PRec=^TRec;
      TRec= record   //用结构体存包信息
        HardFlag:shortstring;
        Length:integer;
        Sequence:integer;
        Ver:byte;
        Enc:byte;
        Rec:WideChar;
        XML:TFileStream;
      end;