比如Client端有一串字符,要将它传送给Server,用SendText最大可以传送多少个字节。这些字符全部传送完后,在服务器端是不是只产生一个OnClientRead  事件?
或者我要传送一个结构为:
  TSendData = Record
     Name : string;
     Count : integer;
     Size : int64;
   end;
 var
   sendData : TsendData;sendData.name := 'hahahha';
SendData.Count := 64;
SendData.Size := 12;我如何把SendData 这些值传送过去Server,  Server又如何读取这些数据??

解决方案 »

  1.   

    一般是这样发送的:SendData(sendData^, SizeOf(sendData^));
    接收的时候按结构体接收:DataRecv(sendData^, SizeOf(sendData^));
    一般发送的数据过大的时候,就会分包发送,你可以看返回值,比如:你发送的数据有1024
    实际一次只接收了512,那么就是两次!
      

  2.   

    如果你只是发送这个包,不发送别的数据(服务器端不用区分):发送Socket.writebuffer(sendData,sizeof(sendData));接收Socket.ReceiveBuf(sendData,sizeof(sendData));
      

  3.   

    TSendData = Record
         Name : string[10]; ///////////////
         Count : integer;
         Size : int64;
       end;
    上面的方法才可以正常使用
      

  4.   

    一样呀,可以放在TSendData里,也可以单独发文字,再定议一个握手信息,知道传过来的是什么数据就行了。
      

  5.   

    如何定义这个握手信息?比如我第一次发送为:
    TSendData = Record
         Name : string[10]; ///////////////
         Count : integer;
         Size : int64;
       end;第二次发送为:
    TSendData = Record
         Name : string[10]; ///////////////
         Send_Type : Byte;
         Message : String[255];
         Count : integer;
         Size : int64;
       end;
    客户端发包要如何定义才能让服务器识别它是什么数据呢??
    另外,当其中有一串数据很大,分了两个包发出,服务器ReceiveBuf(sendData,sizeof(sendData));会不会读出两次不同的结果?
      

  6.   

    定义一个 SL:TStringList;SL.Append('温度');SL.Append('38');然后到 服务器,同样定义一个SL,读取SL的各行,就可以了。
      

  7.   

    定义包头,大小固定,比如HEADER : BYTE;
    包体,发送不同的包体之前先发送它的包头。接收:
    不用管什么接收事件(当然接收代码还得写在这个事件里)。
    先接收包头
    Socket.writebuffer(HEADER ,sizeof(THEADER));
    解析后就知道要接收哪个包了
    Socket.ReceiveBuf(sendData,sizeof(sendData));
      

  8.   

    老大们,看了tanxj兄的问题我又有个疑问,再这里可以和大家一起讨论不? 
        我做的东西也是要传文字+数据,下位机用的是vc写的串口通信,因为我的数据是先通过串口发送到inter网,然后再接收到主机的,主机这边是delphi写的,我想能不能在下位机vc写的串口通信里定义一个struct ss,然后在主机这边定义同样的record ss;读数据,这样行吗?
      

  9.   

    另外,如果客户端在发送完数据后当前过程不结束,能不能直接在当前过程中取得服务器的数据回送,如果可以,要怎样做??
    例如:
    procedure TestSendData;
    begin
      ClientSocket.Socket.sendBuff(sendData,Sizeof(sendData));
      在这里等待回应;
      ClientSocket.Socket.ReceiveBuf(ReceData,Sizeof(ReceData));
      //下面如何判断是否收到回应数据,再做相应操作呢??
    end;
      

  10.   

    不一定产生一次OnClientRead  事件,要进行粘包处理。