我想要做一个网络数据传输的软件,想用TSERVERSOCKET和TCLIENTSOCKET控件。但是SOCKET控件在收到数据太频繁的话会型成一堆数据,而且中间还会有一些无用的数据。我想过用包头和包尾来分辨数据包,但是又怕数据中恰好有一段数据是和数据包头和数据包尾一样的话就麻烦了。请问高手们怎么解决这个问题呢??

解决方案 »

  1.   

    定长度的发包就可以了
    不要用SendText,用SendBuffer
    其中的buffer可以自己定义
    比如
    type
      Tmybuf = record
       BufType[10]:string;         //算是包头吧,也可以不要
       Data:array[0..1023] of char;//真正用来保存数据的数组
       IntData:integer;            //有的时候需要发送包的长度,所以定义一个整数
    ................
    end;大概就是按上面的形式去定义一个自己的类型,用的时候,发送:
    var
      buf:TMybuf;   //定义用来保存要发送内容的变量
    begin
      buf.BufType:='MSG';  //比如这个包是用来发送一句话的
      strpcopy(buf.Data,'呵呵,你好'); //把"呵呵,你好"复制到buf.Data里去
      ClientSocket1.SendBuffer(buf,sizeof(buf);//把数据包发送出去
    end;接收的时候:
    var
      buf:TMybuf;
    begin
      ServerSocket1.ReceiveBuffer(buf,sizeof(buf));//接收数据包,放到buf变量里  //下面是对不同数据包的处理
      if buf.BufType='MSG' then  //如果收到的是消息类型的数据包 
      begin
         ShowMessage(buf.Data)   //把内容用对话框显示出来
      end  else if buf.BufType='xxx' then  //下面的是其他类型数据包的处理
      begin
        ................
      end
      else if ..............
      ...............
      else
          exit;
      end;
    end;模式就是这样了,如果还有不懂的,Q我,215422567