clientFrm.pas
上传用户:psxgmh
上传日期:2013-04-08
资源大小:15112k
文件大小:4k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit clientFrm;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  5.   StdCtrls, ScktComp, ExtCtrls, ToolWin, ComCtrls, Menus, Buttons, shellapi,
  6.   jpeg, ImgList;
  7. type
  8.   TfrmClient = class(TForm)
  9.     Image: TImage;
  10.     ClientSocket: TClientSocket;
  11.     ImageList1: TImageList;
  12.     ToolBar1: TToolBar;
  13.     btnConnect: TToolButton;
  14.     btnSnap: TToolButton;
  15.     btnDisConnect: TToolButton;
  16.     btnClose: TToolButton;
  17.     procedure bu_snapClick(Sender: TObject);
  18.     procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
  19.     procedure FormCreate(Sender: TObject);
  20.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  21.     procedure btnConnectClick(Sender: TObject);
  22.     procedure btnSnapClick(Sender: TObject);
  23.     procedure btnDisConnectClick(Sender: TObject);
  24.     procedure ClientSocketConnect(Sender: TObject;
  25.       Socket: TCustomWinSocket);
  26.     procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;
  27.       ErrorEvent: TErrorEvent; var ErrorCode: Integer);
  28.     procedure BtnCloseClick(Sender: TObject);
  29.   private
  30.     { Private declarations }
  31.   public
  32.     { Public declarations }
  33.   end;
  34. var
  35.   frmClient: TfrmClient;
  36. implementation
  37. const bufsize = 2048;//接收数据缓冲区的最大值
  38. var
  39.   stream: Tmemorystream; //存储接收到jpeg内存流
  40.   jpegscreen: Tjpegimage; //存储jpeg图象
  41. {$R *.DFM}
  42. //当窗体创建时,创建Stream,jpegStream对象
  43. procedure TfrmClient.FormCreate(Sender: TObject);
  44. begin
  45.   stream := Tmemorystream.Create;
  46.   jpegscreen := Tjpegimage.Create;
  47. end;
  48. //当窗体关闭时,关闭套接字的连接,并释放stream,jpegStream对象
  49. procedure TfrmClient.FormClose(Sender: TObject; var Action: TCloseAction);
  50. begin
  51.   clientsocket.Active := false;
  52.   stream.Free;
  53.   jpegscreen.Free;
  54. end;
  55. //连接服务器
  56. procedure TfrmClient.BtnConnectClick(Sender: TObject);
  57. var
  58.   remotehost: string;
  59. begin
  60.   //输入远程服务器的IP地址
  61.   remotehost := inputbox('建立连接', '请输入被察看的机器的IP地址或名称:', '');
  62.   if trim(remotehost) <> '' then
  63.   begin
  64.     if clientsocket.Active then clientsocket.Active := true;
  65.     clientsocket.Port := 1234;
  66.     clientsocket.Host := remotehost;
  67.     //连接
  68.     try
  69.       clientsocket.Active := true;
  70.     except
  71.       raise Exception.Create('连接失败!');
  72.     end;
  73.   end;
  74. end;
  75. //断开连接
  76. procedure TfrmClient.btnDisConnectClick(Sender: TObject);
  77. begin
  78.   clientsocket.Active := false;
  79.   stream.Clear;
  80. end;
  81. //向服务器端发出'show'指令,要求获取它的屏幕
  82. procedure TfrmClient.btnSnapClick(Sender: TObject);
  83. begin
  84.   stream.Clear;
  85.   if not ClientSocket.Active then
  86.   Raise Exception.Create('请先连接');
  87.   clientsocket.Socket.SendText('show');
  88. end;
  89. //关闭窗口
  90. procedure TfrmClient.BtnCloseClick(Sender: TObject);
  91. begin
  92.   clientsocket.Active := false;
  93.   close;
  94. end;
  95. //客户端接收远程屏幕图象
  96. procedure TfrmClient.ClientSocketRead(Sender: TObject;
  97.   Socket: TCustomWinSocket);
  98. var
  99.   buf: array[0..bufsize - 1] of char;
  100.   numberbytes: integer;
  101. begin
  102.   numberbytes := socket.ReceiveLength;
  103.   //接收数据
  104.   socket.receiveBuf(buf, numberbytes);
  105.   //累加读到stream内存流中
  106.   stream.Write(buf, numberbytes);
  107.   //当接收到的数据不等于bufSize,代表接收的屏幕图象的最后一个数据,
  108.   //否则,代表还没有接收完,继续相服务器端发送'show'指令,继续获取数据
  109.   if NumberBytes = bufSize then
  110.     Socket.SendText('show')
  111.   else
  112.     begin
  113.       try
  114.         //此句代码,非常重要,千万不要忘写,它将内存流指针移到头,
  115.         //否则读取内存流时,会从当前位置开始读
  116.         Stream.Position := 0;
  117.         //将内存流读到JpegScreen图象中
  118.         jpegscreen.LoadFromStream(stream);
  119.         //显示在image组件中
  120.         image.Picture.Bitmap.Assign(jpegscreen);
  121.       except
  122.         stream.Clear;
  123.       end;
  124.     end;
  125. end;
  126. procedure TfrmClient.ClientSocketConnect(Sender: TObject;
  127.   Socket: TCustomWinSocket);
  128. begin
  129.   showmessage('连接成功!');
  130. end;
  131. //当客户端Socket出错时,清空stream数据
  132. procedure TfrmClient.ClientSocketError(Sender: TObject;
  133.   Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  134.   var ErrorCode: Integer);
  135. begin
  136.   stream.Clear;
  137. end;
  138. end.