实现的原理
WINSOCK是一组API,用于在INTE.Net上传输数据和交换信息。用它编程本来是很麻烦的,但在DELPHHI中并不需要直接与WINSOCK的API打交道,因为TclientSocket和TserverSocket元件封装了它的大部分API,使得对WINSOCK的访问大大简化。
SOCKET是网络通信的基本构件,是可以被命名和寻址的通信端点,使用中的第一个SOCKET都有其类型和一个与之相连的进程。SOCKET存在于通信区域中,通信区域也叫地址族,是一个抽象概念,主要用于将通过SOCKET通信线程的共有特性综合在一起。SOCKET通常只与同一区域中的SOCKET交换数据,也有可能跨区域通信,但这只是在执行了某种转换进程后才能实现。
要通过网络传输数据,至少需要一对SOCKET。其中,一个SOCKET在客户端,另一个SOCKET在服务器端。一旦客户端和服务器端都接通了SOCKET,它们之间就可以相互通信,其连接是建立在TCP/IP协议基础上的,同时也支持其他相关协议,如XNS、DE.Net及IPX/SPX等。
本系统就是基于上述原理的,它由两部分组成:驻留端和控制端。
驻留端放在需要监控的机器上,WINDOWS启动时自动运行,并且要很好的隐藏起来:不出现的任务栏上,当用户按下CTRL+ALT+DEL时,也不能从任务列表中发现。
控制端放在管理员的机器上,管理员通过指令可以观察或控制被监控的机器。指令有五个:
截取屏幕:可以观察到被控机的当前屏幕,看操作员在干什么。
远程关机:可以关闭被控的计算机。
远程重启:可以重新启动被控的计算机。
锁定机器:封锁被控机的操作,键盘、鼠标操作都无效。
机器解锁:解除对被控机的封锁。
代码编写
1、 控制端
主窗体设计如效果图,各控件名称如下表:

名称 控件类型 标题 用途
HscrollB TScrollBar; 滚动图像
VScrollB TscrollBar 滚动图像
Label1 Tlabel 显示文字
Ipbox TcomboBox 显示IP地址列表
RadioGroup1 TRadioGroup 美化界面
Cuts TradioButton 截屏选择
Cloma TradioButton 关机选择
Restart TradioButton 启动选择
Lock TradioButton 锁定选择
Unlock TradioButton 解锁选择
Button1 Tbutton 添加IP地址
Button2 Tbutton 执行指令
Button3 Tbutton 关闭界面
Button4 Tbutton 连接监控端
ImPanel TPanel 美化界面
Image Timage 显示图像
Panel1 TPanel 显示状态
Kz TclientSocket 建立连接
tccd TPopupMenu 弹出菜单

控制端代码不太复杂,主要在为了显示从被监控机器传过来的数据时有点复杂,下面单独说明一下:
procedure TForm1.kzRead(Sender: TObject; Socket: TCustomWinSocket);
var buf:array[0..buffer-1] of char;//定义一个缓冲区,大小为2048字节
temp:integer;
begin
temp:=socket.ReceiveLength;//得到传来数据的长度
panel1.Caption:=‘正在接收来自‘+ipbox.Text+‘的图像数据,稍侯……‘;
bmpmap.WriteBuffer(buf,Socket.ReceiveBuf(buf,temp));把缓冲区的数据写入流
if temp<buffer then//如果数据长度小于缓冲区,说明数据已传完,显示图像
begin
bmpmap.Position:=0;
ScrollReset;
image.Picture.Bitmap.LoadFromStream(bmpmap);
bmpmap.clear;
panel1.Caption:=‘图像已经成功的接收!‘;
end
else Socket.SendText(‘cut‘);//否则继续要求传输
end;
在显示图像时,是通过滚动条和图像控件组合使用的,请注意代码
当然,为了让软件更专业,要有托盘图标,这使代码复杂一些,这些功能在本系统中都实现了,请留意源代码。下面给出该系统的源代码:(代码容易看明白,不详细解释了)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
StdCtrls, ExtCtrls, ComCtrls, ScktComp,shellapi, Menus;

const wm_icb=wm_user+1000;
type
TForm1 = class(TForm)
hScrollB: TScrollBar;
vScrollB: TScrollBar;
Label1: TLabel;
ipbox: TComboBox;
RadioGroup1: TRadioGroup;
cuts: TRadioButton;
cloma: TRadioButton;
restart: TRadioButton;
lock: TRadioButton;
unlock: TRadioButton;
Button1: TButton;
Button2: TButton;
Button3: TButton;
imPanel: TPanel;
Image: TImage;
Panel1: TPanel;
kz: TClientSocket;
Button4: TButton;
tccd: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure vScrollBChange(Sender: TObject);
procedure hScrollBScroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure kzRead(Sender: TObject; Socket: TCustomWinSocket);
procedure kzDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure kzConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure cutsClick(Sender: TObject);
procedure clomaClick(Sender: TObject);
procedure restartClick(Sender: TObject);
procedure lockClick(Sender: TObject);
procedure unlockClick(Sender: TObject);
procedure kzConnecting(Sender: TObject; Socket: TCustomWinSocket);
procedure kzError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ipboxChange(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N1Click(Sender: TObject);
private
Units: TPoint;
myicon:TNotifyicondata;
procedure wmicb(var msg:TMessage);message wm_icb;
procedure ScrollReset;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2, Unit3;

{$R *.DFM}
const
DEF_SCROLL_UNITS = 8;
buffer=2048;
var bmpmap:TMemorystream;
procedure display;
begin
if form1.visible=true then
form1.n1.Caption:=‘显示(&D)‘
else
form1.n1.Caption:=‘隐藏(&H)‘;
form1.visible:=not form1.visible;
application.ShowMainForm:=form1.visible;
setforegroundwindow(application.handle);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
display;
end;

procedure TForm1.Button3Click(Sender: TObject);

begin
if not assigned(form2) then form2:=Tform2.Create(application);
form2.show;
end;

procedure TForm1.vScrollBChange(Sender: TObject);
begin
Image.Top := -Units.y * VScrollb.Position;
end;

procedure TForm1.hScrollBScroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
begin
Image.Left := -Units.x * ScrollPos
end;

procedure TForm1.ScrollReset;
begin
Units.x := DEF_SCROLL_UNITS;
Units.y := DEF_SCROLL_UNITS;
if Image.Picture <> nil then
begin
Image.Top := 0;
Image.Left := 0;
HScrollb.Position := 0;
VScrollb.Position := 0;
HScrollb.Min := 0;
VScrollb.Min := 0;
HScrollb.Visible := True;
VScrollb.Visible := True;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if cuts.Checked then
begin
panel1.Caption:=‘截取‘+ipbox.Text+‘计算机的屏幕!‘;
bmpmap.Clear;
kz.Socket.SendText(‘cut‘);
end
else if cloma.Checked then
begin
panel1.Caption:=‘关闭‘+ipbox.Text+‘的计算机!‘;
kz.Socket.SendText(‘ygj‘);
kz.Active:=false;
end
else if restart.Checked then
begin
panel1.Caption:=‘重新启动‘+ipbox.Text+‘的计算机!‘;
kz.Socket.SendText(‘yqd‘);
kz.Active:=false;
end
else if lock.Checked then
begin
panel1.Caption:=‘锁定‘+ipbox.Text+‘的计算机!‘;
kz.Socket.SendText(‘sdj‘);
end
else if unlock.Checked then
begin
panel1.Caption:=‘解锁‘+ipbox.Text+‘的计算机!‘;
kz.Socket.SendText(‘jsj‘);
end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
myicon.cbSize:=sizeof(TNotifyicondata);
myicon.Wnd:=handle;
myicon.uID:=1;
myicon.uFlags:=nif_message or nif_tip or nif_icon;
myicon.uCallbackMessage:=wm_icb;
myicon.hIcon:=application.Icon.Handle;
myicon.szTip:=‘大眼睛 V1.0‘;
shell_notifyicon(nim_add,@myicon);
setwindowlong(application.handle,gwl_exstyle,ws_ex_toolwindow);
bmpmap:=TMemorystream.Create;
ipbox.Items.LoadFromFile(‘pzwj.ini‘);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
bmpmap.free;
shell_notifyicon(nim_delete,@myicon);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
if ipbox.Text=‘‘ then exit;
if button4.Caption=‘连接(&C)‘ then
begin
kz.Address:=ipbox.Text;
kz.Active:=true;
button1.Enabled:=true;
end
else
begin
kz.Active:=false;
button1.Enabled:=false;
end;
end;
procedure TForm1.kzRead(Sender: TObject; Socket: TCustomWinSocket);
var buf:array[0..buffer-1] of char;
temp:integer;
begin
temp:=socket.ReceiveLength;
panel1.Caption:=‘正在接收来自‘+ipbox.Text+‘的图像数据,稍侯……‘;
bmpmap.WriteBuffer(buf,Socket.ReceiveBuf(buf,temp));
if temp<buffer then
begin
bmpmap.Position:=0;
ScrollReset;
image.Picture.Bitmap.LoadFromStream(bmpmap);
bmpmap.clear;
panel1.Caption:=‘图像已经成功的接收!‘;
end
else Socket.SendText(‘cut‘);
end;

procedure TForm1.kzDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
button4.Caption:=‘连接(&C)‘;
panel1.Caption:=‘已经和‘+ipbox.Text+‘断开连接‘;
end;

procedure TForm1.kzConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
button4.Caption:=‘断开(&D)‘;
panel1.Caption:=‘已经成功的连接到‘+ipbox.Text;
end;

procedure TForm1.cutsClick(Sender: TObject);
begin
panel1.Caption:=‘截取远程计算机的屏幕‘;
end;

procedure TForm1.clomaClick(Sender: TObject);
begin
panel1.Caption:=‘关闭远程计算机‘;
end;

procedure TForm1.restartClick(Sender: TObject);
begin
panel1.Caption:=‘重新启动远程计算机‘;
end;

procedure TForm1.lockClick(Sender: TObject);
begin
panel1.Caption:=‘锁定远程计算机‘;
end;

procedure TForm1.unlockClick(Sender: TObject);
begin
panel1.Caption:=‘恢复远程计算机‘;
end;

procedure TForm1.kzConnecting(Sender: TObject; Socket: TCustomWinSocket);
begin
panel1.Caption:=‘正在连接‘+ipbox.Text;
end;

procedure TForm1.kzError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
kz.Active:=false;
panel1.Caption:=‘网络连接出错,请重试!‘;
end;

procedure TForm1.ipboxChange(Sender: TObject);
begin
button4.Caption:=‘连接(&C)‘;
kz.active:=false;
end;

procedure TForm1.wmicb(var msg:TMessage);
var tcwz:TPoint;
begin
case msg.LParam of
wm_lbuttonup:
display;
wm_rbuttonup:
begin
getcursorpos(tcwz);
tccd.Popup(tcwz.x,tcwz.y);
end;
end;
end;
procedure TForm1.N3Click(Sender: TObject);
begin

procedure TForm1.kzClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var buf:array[0..buffer-1] of char;//开辟一个缓冲区来保存要发送的数据
sendsize,temp:integer;
temps:string;
begin
temps:=Socket.ReceiveText;
if temps=‘cut‘ then //如果是截屏指令
begin
if bmpstream.Size=0 then screencap(0,0,800,600);//如果没生成图像就截屏
if leftsize>buffer then sendsize:=buffer
else sendsize:=leftsize;
bmpstream.ReadBuffer(buf,sendsize);//从内存流中将数据读入缓冲区
leftsize:=leftsize-sendsize;
if leftsize=0 then bmpstream.clear;
socket.Sendbuf(buf,sendsize);//发送数据
end
else if temps=‘ygj‘ then ExitWindowsEx(EWX_SHUTDOWN,0)//关闭机器
else if temps=‘yqd‘ then ExitWindowsEx(EWX_REBOOT,0)//重新启动机器
else if temps=‘sdj‘ then//如果是锁定机器指令
begin
enablewindow(getdesktopwindow,false);
end
else if temps=‘jsj‘ then//如果是解除指令
begin
enablewindow(getdesktopwindow,true);
end
end;
end.

http://blog.sina.com.cn/s/blog_562349090100zufn.html

利用Delphi实现网络监控系统的更多相关文章

  1. 开源网络监控管理系统:OpenNMS

    OpenNMS是一个开源的企业级基于Java/XML的分布式网络和系统监控管理平台.OpenNMS是管理网络的绝好工具,它能够显示网络中各中终端和服务器的状态和配置,为方便地管理网络提供有效的信息. ...

  2. 利用WCF的双工通讯实现一个简单的心跳监控系统 z

    利用WCF的双工通讯实现一个简单的心跳监控系统 http://www.cnblogs.com/zuowj/p/5761011.html 何为心跳监控系统? 故名思义,就是监控某个或某些个程序的运行状态 ...

  3. 分布式监控系统之Zabbix网络发现

    前文我们了解了zabbix的宏,自定义item和模板的相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14013331.html:今天我们来了解下zab ...

  4. 如何利用SimpleNVR建立全天候远程视频监控系统

    随着社会经济的发展,5G.AI.云计算.大数据.物联网等新兴技术迭代更新的驱动下,传统的安防监控早已无法满足我们的需求.那么我们如何建立全天候远程视频监控系统来替代传统监控呢?如何进一步优化城市管理. ...

  5. 利用WCF的双工通讯实现一个简单的心跳监控系统

    何为心跳监控系统? 故名思义,就是监控某个或某些个程序的运行状态,就好比医院里面的心跳监视仪一样,能够随时显示病人的心跳情况. 心跳监控的目的是什么? 与医院里面的心跳监视仪目的类似,监控程序运行状态 ...

  6. 监控系统Opserver的配置调试

    Stack Exchange开源其监控系统Opserver有一段时间了.之前在项目中用过他们的MiniProfile来分析页面执行效率和帮助新人了解项目,当他们开源了其监控系统的时候正好部门也在关注监 ...

  7. 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 开源倾情奉献系列链接 开源倾情奉献:基于.NET打造IP智能网络视频监控系统(一)开放源代码 开源倾 ...

  8. Android利用Fiddler进行网络数据抓包

    最新最准确内容建议直接访问原文:Android利用Fiddler进行网络数据抓包 主要介绍Android及IPhone手机上如何进行网络数据抓包,比如我们想抓某个应用(微博.微信.墨迹天气)的网络通信 ...

  9. Android利用Fiddler进行网络数据抓包,手机抓包工具汇总

    Fiddler抓包工具 Fiddler抓包工具很好用的,它可以干嘛用呢,举个简单例子,当你浏览网页时,网页中有段视频非常好,但网站又不提供下载,用迅雷下载你又找不到下载地址,这个时候,Fiddler抓 ...

随机推荐

  1. Cocos2d-x V3.2+Cocos Studio1.6 实现一个简单的uibutton点击功能

    好久没写博客了 这几天在学习cocos studio,这个软件可以很方便的设计游戏的一些界面,并导入到cocos2dx中,今天就用button来做个样例 首先我们打开Cocos Studio1.6,选 ...

  2. 通过手机其他iOS应用打开此文件

    根据所处理文档的格式,提供本地设备(InApp)能处理该格式文档的所有应用(App).比如,demo中所处理的是pdf格式的文档,那么可以打开该文档的本地app有邮件.打印等等.仅支持ARC. dem ...

  3. java-线程-生产者-消费者

    概述 在Java中有四种方法支持同步,其中前三个是同步方法,一个是管道方法. wait() / notify()方法 await() / signal()方法 BlockingQueue阻塞队列方法 ...

  4. win10下安装docker步骤(一)

    一.启用Hyper-V 打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图: 请注意电脑默认的Hyper-V虚拟机监控程序是不能进行勾选的,需要 ...

  5. Android Studio 报错Guest isn't online after 7 seconds 解决方案

     最近使用真机模拟之后,再使用虚拟机就频繁出现这个问题; 解决步骤如下: 1.打开Android虚拟设备管理器, 2.查看Actoins栏下拉图标, 3.选择冷启动模式即可, 4.重启AVD正常;

  6. 在web应用程序中在网页中对Web.config文件进行数据连接配置

    using System; using System.Collections.Generic; using System.Configuration; using System.Web.Configu ...

  7. Struts2——(5)转发和重定向(跨业务模块)

    一.重定向redirect(默认是转发dispatcher)和转发的区别? 1.重定向浏览器的网址发生变化(相当于请求了两次),转发浏览器的网址不发生变化(只请求了一次). 2.重定向的过程:发送请求 ...

  8. PCI GXL学习之再造篇

    作者:朱金灿 来源:http://blog.csdn.net/clever101 再造一个PCI GXL?听起来是一件颇有难度的事,实际上并非不可能.本文拟从必要性.可行性和技术路线等方面谈谈再造PC ...

  9. Msg DisPatch

    一天写了个Carlife 协议数据分流器 #include <stdio.h> #include <string.h> typedef unsigned char uint8_ ...

  10. either you have JavaScript disabled or your browser does not support JavaScript

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在服务器(操作系统为WindowsServer)上部署Hudson平台,使用IE访问:http://localhost ...