serverSocket 接收消息 当接收到很长数据的时候,它会分段接收 有没有地方设,让它收一次就收完了啊

解决方案 »

  1.   

    因为客户端不是我开发的,所以我不知道它里面怎么设置的,用包发的话,收不到!我直接socket.ReceiveText 我length一下长度 最长好像是8190啊
      

  2.   

    Type
      TData = record
        Received: Integer;  //实际接收的长度
        Length: Integer;    //报文长度标识
        Data: AnsiString;   //除长度标识外的业务数据
      end;
      PData = ^TData;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      Data: PData;
      iLen, iRecved: Integer;
    begin
      if Socket.Data = Nil then begin
        New(Data);
        Socket.Data := Data;
        Data.Received := 0;
        Data.Length := 0;
      end else begin
        Data := Socket.Data;
      end;
      iLen := Socket.ReceiveLength;  while Data.Received < 4 do begin
        iRecved := Socket.ReceiveBuf(Data.Length, Min(iLen,4- Data.Received) );
        if iRecved <=0 then Exit;    Data.Received := iRecved + Data.Received;
        if Data.Received = 4 then begin
          Data.Length := ntohl( DATA.Length); //传输时使用的是网络字节序,所以要转换为主机字节序
          SetLength(Data.Data,DATA.Length);
        end;    Dec(iLen, iRecved);
        if iLen <=0 then Exit;
      end;  while (iLen > 0) and (Data.Received < Data.Length + sizeof(Data.Length)) do begin
        iRecved := Socket.ReceiveBuf(Data.Data[Data.Received - 4 + 1], Min(iLen,Data.Length + 4 - Data.Received) );
        if iRecved <=0 then Exit;    Data.Received := iRecved + Data.Received;
        if Data.Received = Data.Length + sizeof(Data.Length) then begin
          Data.Received := 0;
          ShowMessage(Data.Data);
        end;    Dec(iLen, iRecved);
        if iLen <=0 then Exit;
      end;end;