我想用indy udp控件来传输图片,如何做?

解决方案 »

  1.   

    Client端:(发方)  private
        stream : TMemoryStream; //定义内存流,其实用
                                  文件流也可以
        size,count : integer;   //文件大小
      end;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
      ClientSocket1.Address := Edit1.Text;
      ClientSocket1.Active := True;
    end;procedure TForm1.ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      StatusBar1.SimpleText := 'Connected to '+Socket.RemoteAddress;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      stream := TMemoryStream.Create;
      if OpenDialog1.Execute then
      begin
        stream.LoadFromFile(OpenDialog1.FileName);
        size := stream.Size;   //获得文件大小
        count := 0;
        ClientSocket1.Socket.SendText(inttostr(size)); //先发送大小
      end;
    end;procedure TForm1.ClientSocket1Read(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      rcvtxt : string;
      buf : array [1..2048] of char;
      left : integer;
    begin
      rcvtxt := Socket.ReceiveText;
      left := size - count;  //未读字节数
      if AnsiPos('go',rcvtxt)=1 then
      begin
        if sizeof(buf)<left then  //若满一块则读一块
        begin
          stream.Read(buf,sizeof(buf));
          Socket.SendBuf(buf,sizeof(buf));
          count := count + sizeof(buf);
        end
        else                   //不满则发剩余的
        begin
          stream.Read(buf,left);
          Socket.SendBuf(buf,left);
        end;
      end;
    end;
    Server端(收方)
      private
        Tof : file;
        size,count :integer;
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.CutFirst(denstr: string;scrstr: string);
    var
      len :integer;
    begin
      len := length(scrstr);
      denstr := copy(scrstr,2,(len-1));
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ServerSocket1.Active := True;
      StatusBar1.SimpleText := 'Listening...';
    end;procedure TForm1.ServerSocket1Accept(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
      StatusBar1.SimpleText := 'Connected from '+ Socket.RemoteAddress;
    end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      buf : array [1..2048] of char;
      rcvtxt : string;
      left,len : integer;
    begin
      len := Socket.ReceiveLength;
      if len<10 then      //若长度小于10则认为是文件长度
      begin
        rcvtxt := Socket.ReceiveText;
        size := strtoint(rcvtxt);
        count := 0;
        if SaveDialog1.Execute then
        begin
          AssignFile(ToF, SaveDialog1.FileName);
          Rewrite(ToF, 1);
        end;
        Socket.SendText('go');
      end
      else
      begin
        left := size - count;  //未写的字节数
        if sizeof(buf)<left then    //满一块则写一块
        begin
          Socket.ReceiveBuf(buf,sizeof(buf));
          BlockWrite(Tof,buf,sizeof(buf));
          count := count + sizeof(buf);
          Socket.SendText('go');
        end
        else               //否则写剩余字节数
        begin
          Socket.ReceiveBuf(buf,left);
          BlockWrite(Tof,buf,left);
          CloseFile(Tof);
        end;
      end;
    end;