我用的TNMUDP,
客户端:
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
  NumberBytes: Integer; FromIP: String; Port: Integer);
var CCode:array[0..3]of char; TmpStream : TMemoryStream;
   SendSize : integer;
begin
  NMUDP1.ReadBuffer(CCode,NumberBytes);
  if CCode[0]='s' then
    begin
      TmpStream:=TMemoryStream.Create;
      try
        if BmpStream.Size=0 then
          begin
            BmpStream.Clear;
            ScreenCap;
          end;
        if LeftSize>BufSize then SendSize:=BufSize else SendSize:=LeftSize;
        //BmpStream.ReadBuffer(TmpStream,SendSize);
        TmpStream.CopyFrom(BmpStream,SendSize);
        LeftSize:=LeftSize-SendSize;
        if LeftSize=0 then BmpStream.Clear;
        NMUDP1.RemoteHost:=FromIP;
        NMUDP1.SendStream(TmpStream);
      finally
        TmpStream.Free;
      end;
    end;
end;服务器:
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
  NumberBytes: Integer; FromIP: String; Port: Integer);
var ReqCode : array[0..3] of char;  Bit:TBitmap;
   jpe: TJPEGImage;
begin
  ReqCode:='show';
  NMUDP1.ReadStream(TmpStream);
  RsltStream.CopyFrom(Tmpstream,NumberBytes);
  if NumberBytes<BufSize then
    begin
      RsltStream.Position:=0;
      if flag='form1' then
        begin
          jpe:=TJPEGImage.Create;
          Bit:=TBitmap.Create;
          try
            jpe.LoadFromStream(RsltStream);
            Bit.Assign(jpe);
            //Image1.Picture.Bitmap.LoadFromStream(RsltStream);
            Image1.Picture.Bitmap:=Bit;
          finally
            jpe.Free;
            Bit.Free;
          end;
        end else
      if flag='form2' then
        begin
          jpe:=TJPEGImage.create;
          Bit:=TBitmap.Create;
          try
            jpe.LoadFromStream(RsltStream);
            Bit.Assign(jpe);
            StretchBlt(form2.Canvas.Handle,0,0,screen.Width,screen.Height,
               Bit.Canvas.Handle,0,0,600,450,srccopy);
            form2.Show;
          finally
            Bit.Free;
            jpe.free;
          end;
        end;
      TmpStream.Clear;
      RsltStream.Clear;
    end else
      begin
        TmpStream.Clear;
        NMUDP1.RemoteHost:=edit1.Text;
        NMUDP1.SendBuffer(ReqCode,4);
      end;
end;

解决方案 »

  1.   

    我用的TNMUDP,
    客户端:
    procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
      NumberBytes: Integer; FromIP: String; Port: Integer);
    var CCode:array[0..3]of char; TmpStream : TMemoryStream;
       SendSize : integer;
    begin
      NMUDP1.ReadBuffer(CCode,NumberBytes);
      if CCode[0]='s' then
        begin
          TmpStream:=TMemoryStream.Create;
          try
            if BmpStream.Size=0 then
              begin
                BmpStream.Clear;
                ScreenCap;
              end;
            if LeftSize>BufSize then SendSize:=BufSize else SendSize:=LeftSize;
            //BmpStream.ReadBuffer(TmpStream,SendSize);
            TmpStream.CopyFrom(BmpStream,SendSize);
            LeftSize:=LeftSize-SendSize;
            if LeftSize=0 then BmpStream.Clear;
            NMUDP1.RemoteHost:=FromIP;
            NMUDP1.SendStream(TmpStream);
          finally
            TmpStream.Free;
          end;
        end;
    end;服务器:
    procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
      NumberBytes: Integer; FromIP: String; Port: Integer);
    var ReqCode : array[0..3] of char;  Bit:TBitmap;
       jpe: TJPEGImage;
    begin
      ReqCode:='show';
      NMUDP1.ReadStream(TmpStream);
      RsltStream.CopyFrom(Tmpstream,NumberBytes);
      if NumberBytes<BufSize then
        begin
          RsltStream.Position:=0;
          if flag='form1' then
            begin
              jpe:=TJPEGImage.Create;
              Bit:=TBitmap.Create;
              try
                jpe.LoadFromStream(RsltStream);
                Bit.Assign(jpe);
                //Image1.Picture.Bitmap.LoadFromStream(RsltStream);
                Image1.Picture.Bitmap:=Bit;
              finally
                jpe.Free;
                Bit.Free;
              end;
            end else
          if flag='form2' then
            begin
              jpe:=TJPEGImage.create;
              Bit:=TBitmap.Create;
              try
                jpe.LoadFromStream(RsltStream);
                Bit.Assign(jpe);
                StretchBlt(form2.Canvas.Handle,0,0,screen.Width,screen.Height,
                   Bit.Canvas.Handle,0,0,600,450,srccopy);
                form2.Show;
              finally
                Bit.Free;
                jpe.free;
              end;
            end;
          TmpStream.Clear;
          RsltStream.Clear;
        end else
          begin
            TmpStream.Clear;
            NMUDP1.RemoteHost:=edit1.Text;
            NMUDP1.SendBuffer(ReqCode,4);
          end;
    end;
      

  2.   

    我用的是clientsocket,serversocket ,能否给出这方面的例子
      

  3.   

    yansea(思宏) ,我们俩编写的源代码除了组件用的不同别的几乎都一样
      

  4.   

    uses
        jpeg;procedure TForm1.Button1Click(Sender: TObject);
    var
        dc:hdc;
        bmp:tbitmap;
        jpg:tjpegimage;
        stream:tmemorystream;
    begin
        i:=gettickcount;
        dc:=getdc(0);
        bmp:=tbitmap.Create;
        bmp.width:=screen.Width; bmp.height:=screen.height;
        bitblt(bmp.canvas.handle,0,0,bmp.width,bmp.height,dc,0,0,srccopy);
        releasedc(0,dc);
        stream:=tmemorystream.Create;
        jpg:=tjpegimage.Create;
        jpg.grayscale:=true;
        jpg.Assign(bmp);
        jpg.SaveToStream(stream);
        nmstrm1.PostIt(stream);
        jpg.free;
        stream.free;
        bmp.free;
    end;procedure TForm1.NMStrmServ1MSG(Sender: TComponent; const sFrom: String;
      strm: TStream);
    var
        jpg:tjpegimage;
    begin
        jpg:=tjpegimage.Create;
        jpg.LoadFromStream(strm);
        image1.Picture.Bitmap.assign(jpg);
        showmessage(inttostr(gettickcount-i));
    end;
      

  5.   

    NMUDP有长度限制的,超过2k就完蛋了。建议使用udpclient/server,或NMStrmServ/client
      

  6.   

    这个问题不难?在DELPHI目录的DEMO上有个实例,delphi/demo/fastnet/strm