给一段并没写完的远程监控程序,看一下吧,unit client {客户端};
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp, ExtCtrls, Jpeg, ComCtrls;
type
  TForm1 = class(TForm)
    ClientSocket1: TClientSocket;
    Image1: TImage;
    StatusBar1: TStatusBar;
    Panel1: TPanel;
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ClientSocket2: TClientSocket;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ClientSocket1Connect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);
    procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure ClientSocket1Disconnect(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
{ Private declarations }
  public
{ Public declarations }
  end;
var
  Form1: TForm1;
  MySize: Longint;
  MyStream: TMemorystream; {内存流对象}
implementation
{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
begin
{-------- 下面为设置窗口控件的外观属性 ------------- }
{注意:把Button1、Button2和Edit1放在Panel1上面}
  Edit1.Text := '139.0.1.233';
  Button1.Caption := '连接主机';
  Button2.Caption := '抓屏幕';
  Button2.Enabled := false;
  Panel1.Align := alTop;
  Image1.Align := alClient;
  Image1.Stretch := True;
  StatusBar1.Align := alBottom;
  StatusBar1.SimplePanel := True;
{----------------------------------------------- }
  MyStream := TMemorystream.Create; {建立内存流对象}
  MySize := 0; {初始化}
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  if not ClientSocket1.Active then
  begin
    ClientSocket1.Address := Edit1.Text; {远程IP地址}
    ClientSocket1.Port := 3000; {Socket端口}
    ClientSocket1.Open; {建立连接}    ClientSocket2.Address := Edit1.Text; {远程IP地址}
    ClientSocket2.Port := 2000; {Socket端口}
    ClientSocket2.Open; {建立连接}
  end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  Clientsocket1.Socket.SendText('cap'); {发送指令通知服务端抓取屏幕图象}
//  Button2.Enabled := False;
end;procedure TForm1.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  StatusBar1.SimpleText := '与主机' + ClientSocket1.Address + '成功建立连接!';
  Button2.Enabled := True;
end;procedure TForm1.ClientSocket1Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  Errorcode := 0; {不弹出出错窗口}
  StatusBar1.SimpleText := '无法与主机' + ClientSocket1.Address + '建立连接!';
end;procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  StatusBar1.SimpleText := '与主机' + ClientSocket1.Address + '断开连接!';
  Button2.Enabled := False;
end;procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var
  MyBuffer: array[0..10000] of byte; {设置接收缓冲区}
  MyReceviceLength: integer;
  S: string;
  MyBmp: TBitmap;
  MyJpg: TJpegimage;  MyRect,MyLect : TRect;begin
  MyRect := Rect(0,0,800,600);
  Mylect := Rect(0,0,700,500);  StatusBar1.SimpleText := '正在接收数据......';
  if MySize = 0 then {MySize为服务端发送的字节数,如果为0表示为尚未开始图象接收}
  begin
    S := Socket.ReceiveText;
    MySize := Strtoint(S); {设置需接收的字节数}
    Clientsocket1.Socket.SendText('ready'); {发指令通知服务端开始发送图象}
  end
  else
  begin {以下为图象数据接收部分}
    MyReceviceLength := socket.ReceiveLength; {读出包长度}
    StatusBar1.SimpleText := '正在接收数据,数据大小为:' + inttostr(MySize);
    Socket.ReceiveBuf(MyBuffer, MyReceviceLength); {接收数据包并读入缓冲区内}
    MyStream.Write(MyBuffer, MyReceviceLength); {将数据写入流中}
    if MyStream.Size >= MySize then {如果流长度大于需接收的字节数,则接收完毕}
    begin
      MyStream.Position := 0;
      MyBmp := tbitmap.Create;
      MyJpg := tjpegimage.Create;
      try
        MyJpg.LoadFromStream(MyStream); {将流中的数据读至JPG图像对象中}
        MyBmp.Assign(MyJpg); {将JPG转为BMP}
        StatusBar1.SimpleText := '正在显示图像';
        Image1.Picture.Bitmap.Assign(MyBmp); {分配给image1元件 }    //    IMage1.Canvas.CopyRect(MyRect,MyBmp.Canvas,Mylect);      finally {以下为清除工作 }
        MyBmp.free;
        MyJpg.free;
        Button2.Enabled := true;
{ Socket.SendText('cap');添加此句即可连续抓屏 }
//        Socket.SendText('cap');
        MyStream.Clear;
        MySize := 0;
      end;
    end;
  end;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  MyStream.Free; {释放内存流对象}
  if ClientSocket1.Active then
     ClientSocket1.Close; {关闭Socket连接}
  if ClientSocket2.Active then
     ClientSocket2.Close; {关闭Socket连接}end;procedure TForm1.Button3Click(Sender: TObject);
begin
ClientSocket1.Active :=false;
end;procedure TForm1.Button4Click(Sender: TObject);
begin
ClientSocket2.Socket.SendText('50,50');
end;end.

解决方案 »

  1.   

    unit server; {服务端程序}
    interface
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, JPEG, ExtCtrls, ScktComp;
    type
      TForm1 = class(TForm)
        ServerSocket1: TServerSocket;
        ServerSocket2: TServerSocket;
        procedure ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure ServerSocket2ClientRead(Sender: TObject;
          Socket: TCustomWinSocket);
      private
        procedure Cjt_GetScreen(var Mybmp: TBitmap; DrawCur: Boolean);
    {自定义抓屏函数,DrawCur表示抓鼠标图像与否}
    { Private declarations }
      public
    { Public declarations }
      end;
    var
      Form1: TForm1;
      MyStream: TMemorystream; {内存流对象}
    implementation
    {$R *.DFM}procedure TForm1.Cjt_GetScreen(var Mybmp: TBitmap; DrawCur: Boolean);
    var
      Cursorx, Cursory: integer;
      dc: hdc;
      Mycan: Tcanvas;
      R: TRect;
      DrawPos: TPoint;
      MyCursor: TIcon;
      hld: hwnd;
      Threadld: dword;
      mp: tpoint;
      pIconInfo: TIconInfo;
    begin
      Mybmp := Tbitmap.Create; {建立BMPMAP }
      Mycan := TCanvas.Create; {屏幕截取}
      dc := GetWindowDC(0);
      try
        Mycan.Handle := dc;
        R := Rect(0, 0, screen.Width, screen.Height);
        Mybmp.Width := R.Right;
        Mybmp.Height := R.Bottom;
        Mybmp.Canvas.CopyRect(R, Mycan, R);
      finally
        releaseDC(0, DC);
      end;
      Mycan.Handle := 0;
      Mycan.Free;
      if DrawCur then {画上鼠标图象}
      begin
        GetCursorPos(DrawPos);
        MyCursor := TIcon.Create;
        getcursorpos(mp);
        hld := WindowFromPoint(mp);
        Threadld := GetWindowThreadProcessId(hld, nil);
        AttachThreadInput(GetCurrentThreadId, Threadld, True);
        MyCursor.Handle := Getcursor();
        AttachThreadInput(GetCurrentThreadId, threadld, False);
        GetIconInfo(Mycursor.Handle, pIconInfo);
        cursorx := DrawPos.x - round(pIconInfo.xHotspot);
        cursory := DrawPos.y - round(pIconInfo.yHotspot);
        Mybmp.Canvas.Draw(cursorx, cursory, MyCursor); {画上鼠标}
        Mycursor.ReleaseHandle; {释放数组内存}
        MyCursor.Free; {释放鼠标指针}
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      ServerSocket1.Port := 3000; {端口}
      ServerSocket1.Open; {Socket开始侦听}
      ServerSocket2.Port := 2000; {端口}
      ServerSocket2.Open; {Socket开始侦听}
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if ServerSocket1.Active then ServerSocket1.Close; {关闭Socket}
      if ServerSocket2.Active then ServerSocket2.Close; {关闭Socket}  
    end;procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      S, S1: string;
      MyBmp: TBitmap;
      Myjpg: TJpegimage;
    begin
      S := Socket.ReceiveText;
      if S = 'cap' then {客户端发出抓屏幕指令}
      begin
        try
          MyStream := TMemorystream.Create; {建立内存流}
          MyBmp := TBitmap.Create;
          Myjpg := TJpegimage.Create;
          Cjt_GetScreen(MyBmp, True); {True表示抓鼠标图像}
          Myjpg.Assign(MyBmp); {将BMP图象转成JPG格式,便于在互联网上传输}
          Myjpg.CompressionQuality := 10; {JPG文件压缩百分比设置,数字越大图像月清晰,但数据也越大}
          Myjpg.SaveToStream(MyStream); {将JPG图象写入流中}
          Myjpg.free;
          MyStream.Position := 0; {注意:必须添加此句}
          s1 := inttostr(MyStream.size); {流的大小}
          Socket.sendtext(s1); {发送流大小}
        finally
          MyBmp.free;
        end;
      end;
      if s = 'ready' then {客户端已准备好接收图象}
      begin
        MyStream.Position := 0;
        Socket.SendStream(MyStream); {将流发送出去}
      end;
    end;
    procedure TForm1.ServerSocket2ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      S : string;
    begin
      S := Socket.ReceiveText;
      if S = '50,50' then {客户端发出抓屏幕指令}
      begin
           SetCursorPos(50,50);
           mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
           mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
           mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
           mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );  end;
    end;end.
      

  2.   

    这只是一部分
    客户端程序: 
    var 
    Form1: TForm1; 
    c:longint; //服务端发送的字节数
    m:tmemorystream; implementation {$R *.DFM} 
    procedure TForm1.Button2Click(Sender: TObject); 
    begin 
    clientsocket1.Socket.SendText('gets'); //发送申请,通知服务端需要屏幕图象 
    end; 
    procedure TForm1.ClientSocket1Read(Sender: TObject; 
    Socket: TCustomWinSocket); 
    var 
    buffer:array [0..10000] of byte; //设置接收缓冲区 
    len:integer; 
    ll:string; 
    b:tbitmap; 
    j:tjpegimage; 
    begin 
    if c=0 then //C为服务端发送的字节数,如果为0表示为尚未开始图象接收 
    begin 
    ll:=socket.ReceiveText; 
    c:=strtoint(ll); //设置需接收的字节数 
    clientsocket1.Socket.SendText('okok'); //通知服务端开始发送图象
    else 
    ==================================================begin //以下为图象数据接收部分 
    len:=socket.ReceiveLength; //读出包长度 
    socket.ReceiveBuf(buffer,len); //接收数据包并读入缓冲区内 
    m.Write(buffer,len); //追加入流M中 
    if m.Size>=c then //如果流长度大于需接收的字节数,则接收完毕 
    begin
    m.Position:=0; 
    b:=tbitmap.Create; 
    j:=tjpegimage.Create; 
    try 
    j.LoadFromStream(m); //将流M中的数据读至JPG图像对象J中 
    b.Assign(j); //将JPG转为BMP 
    Image1.Picture.Bitmap.Assign(b); //分配给image1元件 
    finally //以下为清除工作 
    b.free; 
    j.free;
    clientsocket1.Active:=false; 
    clientsocket1.Active:=true; 
    m.Clear; 
    c:=0; 
    end; 
    end; 
    end; 
    end; =========================================procedure TForm1.FormCreate(Sender: TObject); 
    begin 
    m:=tmemorystream.Create; end; 
    end. 
    服务端程序: procedure TForm1.ServerSocket1ClientRead(Sender: TObject; 
    Socket: TCustomWinSocket); 
    var 
    s,s1:string; 
    desk:tcanvas; 
    bitmap:tbitmap; 
    jpg:tjpegimage; 
    begin 
    s:=socket.ReceiveText; 
    if s='gets' then //客户端发出申请 
    begin 
    bitmap:=tbitmap.Create; 
    jpg:=tjpegimage.Create; 
    desk:=tcanvas.Create; //以下代码为取得当前屏幕图象 
    desk.Handle:=getdc(hwnd_desktop); 
    m1:=tmemorystream.Create; //初始化流m1,在用sendstream(m1)发送流后, 
    //它将保留到socket对话结束, 
    //不能用手工free掉,否则会触发异常 
    with bitmap do 
    begin 
    width:=screen.Width; 
    height:=screen.Height; 
    canvas.CopyRect(canvas.cliprect,desk,desk.cliprect); 
    end; 
    jpg.Assign(bitmap); //将图象转成JPG格式 
    jpg.SaveToStream(m1); //将JPG图象写入流中 
    jpg.free; 
    m1.Position:=0; 
    s1:=inttostr(m1.size); 
    Socket.sendtext(s1); //发送图象大小 
    end; 
    if s='okok' then //客户端已准备好接收图象 
    begin 
    m1.Position:=0; 
    Socket.SendStream(m1); //发送JPG图象 
    end; end; ================================================================CSDN 论坛助手 Ver 1.0 B0402提供下载。 改进了很多,功能完备!★  浏览帖子速度极快![建议系统使用ie5.5以上]。 ★  多种帖子实现界面。 
    ★  保存帖子到本地[html格式]★  监视您关注帖子的回复更新。
    ★  可以直接发贴、回复帖子★  采用XML接口,可以一次性显示4页帖子,同时支持自定义每次显示帖子数量。可以浏览历史记录! 
    ★  支持在线检测程序升级情况,可及时获得程序更新的信息。★★ 签名  ●  
         可以在您的每个帖子的后面自动加上一个自己设计的签名哟。Http://www.ChinaOK.net/csdn/csdn.zip
    Http://www.ChinaOK.net/csdn/csdn.rar
    Http://www.ChinaOK.net/csdn/csdn.exe    [自解压]
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, ScktComp;type
      TForm1 = class(TForm)
        Button1: TButton;
        ClientSocket1: TClientSocket;
        ServerSocket1: TServerSocket;
        Button2: TButton;
        Memo1: TMemo;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure ClientSocket1Write(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure Button2Click(Sender: TObject);
        procedure ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket;
          ErrorEvent: TErrorEvent; var ErrorCode: Integer);
        procedure ServerSocket1ClientWrite(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocket1Accept(Sender: TObject;
          Socket: TCustomWinSocket);
        procedure ServerSocket1ClientError(Sender: TObject;
          Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
          var ErrorCode: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
            ClientSocket1.Open;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
            ClientSocket1.Close;
            ClientSocket1.Host:='santwy';
            ClientSocket1.Port:='5000';
            ServerSocket1.Close;
            ServerSocket1.Port:='5001';
            ServerSocket1.Open;
    end;procedure TForm1.ClientSocket1Write(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
            ClientSocket1.Socket.SendText(Edit1.Text);
            ClientSocket1.Close;
    end;procedure TForm1.Button2Click(Sender: TObject);
    beginend;procedure TForm1.ClientSocket1Error(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
            ErrorCode := 0 ;
    end;procedure TForm1.ServerSocket1ClientWrite(Sender: TObject;
      Socket: TCustomWinSocket);
    begin
            Memo1.Lines.Add(Socket.ReceiveText());
    end;procedure TForm1.ServerSocket1Accept(Sender: TObject;
      Socket: TCustomWinSocket);
    beginend;procedure TForm1.ServerSocket1ClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
            ErrorCode := 0 ;
    end;end.
      

  4.   

    谢谢各位大虾如此关注,定当以分相酬;请问在发送接收数据时能不能不用OnRead()事件,而用Clientsock.socket.SendBuf()和Clientsock.socket.Recieve()来实现呢?
      

  5.   

    另外,在处理接收的数据时,假如服务器端的代码是用其它语言如VC写的,如何设计客户端代码?还有怎样判断字符串结束?(因为C++中'/0'为结束标志,但在DEPHI中确是以#0为结束标志)