一个客户端 用sendbuffer发送  一个服务器端接收  但总是报告 地址出错得不到正确的对象  

解决方案 »

  1.   

    TMemoStream是可以的,出错可能是你的代码不对吧
      

  2.   

    不用tMemoStream 我是从一个视频中截取到的图片 然后把图片压缩成jpeg格式 然后发出去  但接受不成
      

  3.   

    客户端:
    procedure TClient.CUDPDataReceived(Sender: TComponent;
      NumberBytes: Integer; FromIP: String; Port: Integer);
    var
      CtrlCode:array[0..29] of char;
      Buf:array[0..BufSize-1] of char;
      TmpStr:string;
      SendSize,LeftPos,TopPos,RightPos,BottomPos:integer;
    begin
      CUDP.ReadBuffer(CtrlCode,NumberBytes);{ 读取控制码 }
      if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' then
        begin { 控制码前4位为“show"表示主控机发出了抓屏指令 }
        if BmpStream.Size=0 then { 没有数据可发,必须截屏生成数据 }
          begin
          TmpStr:=StrPas(CtrlCode);
          TmpStr:=Copy(TmpStr,5,Length(TmpStr)-4);
          LeftPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
          TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr));
          TopPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
          TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr));
          RightPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
          BottomPos:=StrToInt(Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-Pos(':',TmpStr)));
          ScreenCap(LeftPos,TopPos,RightPos,BottomPos); {截取屏幕 }
          end;
        if LeftSize>BufSize then SendSize:=BufSize else SendSize:=LeftSize;
        BmpStream.ReadBuffer(Buf,SendSize);
        LeftSize:=LeftSize-SendSize;
        if LeftSize=0 then BmpStream.Clear;{ 清空流 }
        CUDP.RemoteHost:=FromIP; { FromIP为主控机IP地址 }
        CUDP.SendBuffer(Buf,SendSize); { 将数据发到主控机的2100口 }
        end;
    end;服务器端:
    procedure TServer.SUDPDataReceived(Sender: TComponent;
      NumberBytes: Integer; FromIP: String; Port: Integer);
    var ReqCode:array[0..29] of char;
    begin
      SUDP.ReadStream(TmpStream);
      RsltStream.CopyFrom(TmpStream,NumberBytes);
      if NumberBytes < BufSize then { 数据已读完 }
        begin
        RsltStream.Position:=0;
        Image1.Picture.Bitmap.LoadFromStream(RsltStream);
        TmpStream.Clear;
        RsltStream.Clear;
        sleep(2);
        BmpFinish:=True;
        end
      else
        begin
        TmpStream.Clear;
        StrpCopy(ReqCode,'show');
        SUDP.SendBuffer(ReqCode,30);
        BmpFinish:=False;
        end;
    end;
      

  4.   

    我也发一个:
    //客户端:
     //使用timer不断的发送图片内容interval设置为3000
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
        Buf:array[0..BufSize-1] of char;
        sendsize : Integer;
    begin
      //使用jpegStream1.Size来控制截取屏幕snapscreen,
        if jpegStream1.Size=0 then    snapscreen;
           While LeftSize >0  do begin
            if LeftSize > BufSize Then
                sendsize:=BufSize
             else
                sendsize:=LeftSize;
                jpegStream1.ReadBuffer(buf,sendsize);
                LeftSize := LeftSize - sendsize;
              if LeftSize <= 0 then    jpegStream1.Clear;
      //客户端的图片发送,一帧一帧的发送,一帧的大小由 BufSize控制
              self.IdUDPClient1.SendBuffer(buf,sendsize);
          end;
          end;//服务器端:
    procedure Tcontrolform.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    begin
            if AData.Size > 0 then
              begin
               RsltStream.CopyFrom(AData,AData.Size);
               if AData.Size < bufSize then
                  begin
                  RsltStream.Position:=0;
        //          j:=TJpegImage.Create;
                  j.LoadFromStream(RsltStream);
                //  Image1.Picture.Bitmap.LoadFromStream(RsltStream);
                  image1.Picture.Assign(j);
    //              j.Free;
                  RsltStream.Clear;
                  end;
                end;
    end;