简单远程监控软件课程设计实验报告
计算机科学与技术
2011-2-20
《计算机网络原理》课程设计报告
目 录
第 2 页 共 31 页
《计算机网络原理》课程设计报告
一、题目----简单的远程监控软件-----------------------4
二、需求分析---------------------------------------------5
(1)题目分析------------------------------------------------------5 (2)系统功能需求分析------------------------------------------5
三、概要设计 -----------------------------6
(1)系统开发原理----------------------------------------------6 (2)系统运行概述----------------------------------------------6
四、详细设-----------------------------7
客户端----------------------------------------------------------8 服务端---------------------------------------------------------9
五、程序测试
----------------------------10 六、心得体会
----------------------------16 七、源码分析————————————-— 17
一、题目----简单的远程监控软件
第 3 页 共 31 页
计
《计算机网络原理》课程设计报告
(1)任务:实现一个简单的远程监控软件,采用Windows Socket(或Java Socket)编程。采用C/S架构。应该具有易用、美观的图形界面。
(2)客户端功能要求
能够远程监控一台主机,显示主机屏幕内容,能远程关机 能远程下载或上传文件。 能远程执行一些DOS命令。 能远程运行一些可执行命令。
(3)具体实现要求
至少实现其中三个功能。
二、需求分析
第 4 页 共 31 页
《计算机网络原理》课程设计报告
(1)题目分析
远程监控软件一般分两个部分:一部分是客户端程序Client,另一部分是服务器端程序Server,在使用前需要将客户端程序安装到被监控端电脑上,将服务器端程序安装到主控端电脑上。
它的控制的过程是先在被监控端电脑上执行客户端程序,像一个普通的客户一样向主控端电脑中的服务器端程序发出信号,建立一个特殊的远程服务,然后通过这个远 程服务,接收主控端发送过来的远程控制命令,并对命令进行处理,最后将命令处理结果返回给主控端。
通过 远程监控软件,可以获取目标电脑屏幕图像、窗口及进程列表;记录并提取远端键盘事件(击键序列,即监视远端键盘输入的内 容);可以打开、关闭目标电脑的任意目录并实现资源共享;提取拨号网络及普通程序的密码;激活、中止远端程序进程;管理远端电脑的文件和文件夹;关闭或者 重新启动远端电脑中的操作系统;修改Windows注册表;通过远端电脑上、下载文件和捕获音频、视频信号等。
前面所说的是一台电脑对一台电脑的情况,但基于远程服务的远程控制最适合的模式是一对多,即利用远程监控软件,可以使用一台电脑监控多台电脑,只需要利用办公室局域网的优势就可以轻松实现远程多点控制了。
(2)系统功能需求分析
连续获得被控端机器屏幕变化。 实现被控端硬盘文件的下载。 实现对鼠标、键盘的模拟。
实现在被控端机器上执行任意DOS命令。 远程关机计算机。 其他需求
系统实用,界面操作简便。 被监控端自动隐藏运行。
三、概要设计
第 5 页 共 31 页
《计算机网络原理》课程设计报告
(1)系统开发原理
本系统是利用类java.awt.robot中的屏幕截取和鼠标、键盘自动控制功能,然后加上网络传输功能来完成来完成截屏和远程控制的。
(2)系统运行概述
1.启动被监控端,打开指定的UDP端口号。用于读取命令。
2.被监控端读取命令(命令格式为ordername:port)ordername为命令名字,port为主控端打开的TCP端口。
3.接到主控端连接后,被监控端就对当前用户的桌面采用屏幕截取,然后发送给主控端。依被监控端设计的不同,可以设定屏幕截取的时间间隔,时间间隔短一点就可以获得连续屏幕变化了。
4.主控端在画布上对鼠标、键盘事件进行监听,被监控端重演主控端上的事件 5.主控端和被监控端读取和发送数据,分别来实现文件上传和下载。 6.在被监控端实现DOS命令的执行。
服务器端 消息输入/命令处理/结果显模块 通信模 块 INTERNET 客户端 通信模块 命令处理模 块
第 6 页 共 31 页
《计算机网络原理》课程设计报告
四、详细设计
系统使用的关键技术就是Java网络编程和Java图形编程。用Java网络编程实现主控端和被监控端的通讯(命令收发、数据传送),用Java图形编程完成主控端控制界面的编写。具体应用如下:
1.实现主控端(服务器)与被监控端(客户端)之间的通讯。 ——用Java Socket来实现。
2.用Java采集事件,封装成消息,用于发送。
——在主控端机器上采集事件(一般只不过是键盘和鼠标的事件),然后封装成消息类传输到被监控端。
3.在被监控端上重演主控端的动作事件。
—— 在被监控端运行client端,接收消息,如果主控端有请求操作的消息,用Robot截下当前屏幕,传给主控端,主控端显示被监控端的屏幕,是一个位图; 然后接收在这个位图上的鼠标事件和键盘事件,并把鼠标位置(位图上的坐标换算成对应的屏幕上的坐标)和键值送到被监控端上,在被监控端上重演同样的事件。
成功连接监视端TCP端口 读取事件对象 键盘事件 事件类型判断 鼠标事件 键盘事件重演 鼠标事件重演 控制套接关闭 否 是 控制结束
第 7 页 共 31 页
《计算机网络原理》课程设计报告
客户端
客户端开始 客户端界面 获 取 主 机 验证密码 连 接 监 听 来 源 上传 添加主机 下载 可执行命令 DOS命令 关机 屏幕显示 结 束
第 8 页 共 31 页
《计算机网络原理》课程设计报告
服务端
服 务 端 开 始 服 务 端 界 面 连 接 修改端 口 修改密 码 密码验 证 监 听 端 口 添加主机 关机 可执行命令 DOS命令 屏幕记录 下载 上传 结 束
第 9 页 共 31 页
《计算机网络原理》课程设计报告
五、程序测试
客户端界面:
连接主机,输入密码:
第 10 页 共 31 页
《计算机网络原理》课程设计报告
服务端界面:
登陆后客户端界面:
第 11 页 共 31 页
《计算机网络原理》课程设计报告
执行屏幕显示命令后:
第 12 页 共 31 页
《计算机网络原理》课程设计报告
执行关机命令后:
第 13 页 共 31 页
《计算机网络原理》课程设计报告
运行可执行文件QQ. EXE 后:
执行下载命令后:
第 14 页 共 31 页
《计算机网络原理》课程设计报告
服务器端:
第 15 页 共 31 页
《计算机网络原理》课程设计报告
六、心得体会
其实在开始的时候我想写的程序是聊天器的那个题目,一来因为那个容易,做过,二来想把以前写的那个聊天程序完善,后来因为我的电脑上不能安装好ACCESS或者还要下载软件包而没能去写,于是便改写这个。
远程监控可以分为“监”和“控”两部分,其中“监”也就是远程监视,可以分为两大部分:一是对环境的监视,二是对计算机系统及网络设备的监 视,不管怎么说远程监视就是指通过网络获得信息为主:而“控”也就是指远程控制,是指通过网络对远程计算机进行操作的方法,它不仅仅包括对远程计算机进行 重新启动、关机等操作、还包括对远端计算机进行日常设置的工作。通过硬件的配和还可以实现远程开机的功能。总而言之,要想完全控制远端的计算机,首先应该 能够对其监视,也就是可以看到该计算机的屏幕显示,然后才谈得上“控制”,远程控制必须做到“监”、“控”结合,因此我们通常说的远程监控一般泛指就是这 种远程控制。除此之外,对于网络管理员来说,远程控制还包括对网络设备的控制,现今大多数网络设备都支持Telnet,甚至Web方式对其进行远程管理, 这也是一种远程控制的方法。
在本次编程中,有太多的东西不知道该怎么做,还好有同学可以问,去图书馆借了很多有关的书在看,边学边做,收获很大。
第 16 页 共 31 页
《计算机网络原理》课程设计报告
七、源码分析 《1》客户端
(1).连续获得被控端机器屏幕变化
public class WnetWScreenRecordPlayer extends JFrame{ BorderLayout borderLayout1 = new BorderLayout(); Dimension screenSize;
public WnetWScreenRecordPlayer(String s) { setTitle(\"s\"); }
public WnetWScreenRecordPlayer() { super();
screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setSize(screenSize); Screen p = new Screen();
Container c = this.getContentPane(); c.setLayout(borderLayout1); c.add(p,\"Center\"); new Thread(p).start(); this.show(); }
public void a() {
screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setSize(screenSize); Screen p = new Screen();
Container c = this.getContentPane(); c.setLayout(borderLayout1); c.add(p,\"Center\"); new Thread(p).start(); this.show(); }
public static void main(String[] args){ new WnetWScreenRecordPlayer(); } }
class Screen extends JPanel implements Runnable{
第 17 页 共 31 页
《计算机网络原理》课程设计报告
private BorderLayout borderLayout1 = new BorderLayout(); private Image cimage;
public void run(){ int i = 0; while(true){ try{
cimage = loadImage(i + \".jpg\"); i = i + 1; repaint();
Thread.sleep(40);//与录像时每秒帧数一致
}catch(Exception e){ e.printStackTrace(); System.out.println(e); } } }
public Image loadImage(String name) { Toolkit tk = Toolkit.getDefaultToolkit(); Image image = tk.getImage(\"C:/\" + name); MediaTracker mt = new MediaTracker(this); mt.addImage(image, 0); try {
mt.waitForID(0); }catch (Exception e) { e.printStackTrace(); System.out.println(e); }
return image; }
public Screen() { super();
this.setLayout(null); }
public void paint(Graphics g){ super.paint(g);
Graphics2D g2 = (Graphics2D) g; g2.drawImage(cimage, 0, 0, null); } }
第 18 页 共 31 页
《计算机网络原理》课程设计报告
(2).实现被控端硬盘文件的下载
//服务器文件存储。。。。。。 public void down() { try {
int result; existFile=false;
result=Jsave.showSaveDialog(treePane); if(result==Jsave.APPROVE_OPTION) {
selectFile = Jsave.getSelectedFile(); //取得选择的文件
fileName=String.valueOf(selectFile); if(selectFile.exists()) {
String message = \"文件已经存在,要覆盖吗?\"; JOptionPane save= new
Object[] saveButton = {\"OK\JOptionPane(message,JOptionPane.WARNING_MESSAGE,
JOptionPane.DEFAULT_OPTION,null,saveButton);
JDialog saveD = save.createDialog(save,\"保存文件\"); //产生 saveD 对话框
saveD.setVisible(true); Object push = save.getValue(); if(push == saveButton[0]) {
existFile=true; } } else {
existFile=true; } if(existFile) {
File outputFile = new File(selectFile.getAbsolutePath()); fo=new FileOutputStream(outputFile);
String str=String.valueOf(tree.getSelectionPath()); System.out.println(str); out.println(\"&download&\");
第 19 页 共 31 页
《计算机网络原理》课程设计报告
out.flush();
out.println(str); out.flush();
} } }
catch(IOException e) {}
}
(3).实现对键盘的模拟
class KeyLis extends KeyAdapter {
Ctree tree; SerWin ser; int select;
public KeyLis(Object tree,int select) {
this.select=select; if(select<20)
this.tree=(Ctree)tree; else if(select>=20) this.ser=(SerWin)tree; }
public void keyTyped(KeyEvent e) {
if(e.getKeyChar()=='\\n') if(select==1)
tree.listen.dispose(); else if(select==2) tree.addchoice(); else if(select==20) {
ser.change.dispose();
ser.password(); } } }
(4).实现对鼠标的模拟
第 20 页 共 31 页
《计算机网络原理》课程设计报告
class HandleMouse implements MouseListener {
public void mouseClicked(MouseEvent e) {
currentPath=c.tree.getSelectionPath();
//取得当前节点
c.node1 = (DefaultMutableTreeNode)(currentPath.getLastPathComponent()); Ctree c;
boolean twoPath=false; TreePath currentPath=null; public HandleMouse(Ctree c) { }
this.c=c;
boolean noRootChild; //判断是否是主机节点
noRootChild=!(c.node1.getParent()==c.node1.getRoot());
if(e.getClickCount()==2&&!noRootChild) //双击主机节点,加载数据 {
boolean reload=true;
StringTokenizer strHP=new
StringTokenizer(c.node1.toString(),\":\");//(String)c.node1.getUserObject()与c.node1.toString()等价,为取得节点名称
String HN=strHP.nextToken();
int IPP=Integer.parseInt(strHP.nextToken()); //System.out.println(\"startPort is \"+c.startPort);
if(c.startPort)//已经有加载的主机 {
if(c.HostName.equals(HN)&&(c.IPPort==IPP)) reload=false; }
if(reload) {
c.HostName=HN; c.IPPort=IPP; if(c.startPort) {
c.quit(); }
// TreePath parentPath = c.tree.getSelectionPath();
// c.node1 =
(DefaultMutableTreeNode)(parentPath.getLastPathComponent());
第 21 页 共 31 页
《计算机网络原理》课程设计报告
// System.out.println(c.node1); c.connect(); } }
else {
{
try {
if(e.getClickCount()==2&&!(c.node1.getChildCount()>0)&&!c.node1.isRoot())
DefaultMutableTreeNode node2=null; c.out.println(\"addClientTree\");
c.out.flush();
c.out.println(String.valueOf(currentPath)); c.out.flush();
String s=new String(\"\"); String F_ornot=new String(\"\"); s=c.in.readLine();
//node2=new DefaultMutableTreeNode(s); //System.out.println(s); if(s.equals(\"&isFile&\")) {
String filepath=c.in.readLine(); System.out.println(filepath);
int parameter=JOptionPane.showConfirmDialog(null, \"打开或运行 \"+filepath,\"打开[\"+c.HostName+\"]\YES_NO_OPTION);
if(parameter==0) {
c.out.println(\"&execute&\"); c.out.flush(); } else {
c.out.println(\"&inexecute&\"); c.out.flush();
} s=c.in.readLine(); } {
F_ornot=c.in.readLine(); if(node2==null)
// System.out.println(F_ornot);
while(!s.equals(\"&&over&&\"))
第 22 页 共 31 页
《计算机网络原理》课程设计报告
}
{
if(F_ornot.equals(\"directory\"))
node2=new DefaultMutableTreeNode(s); else
node2=new DefaultMutableTreeNode(s,false); c.node1.add(node2);
}
else if(F_ornot.equals(\"directory\"))
{
// System.out.println(F_ornot+\" add directory\"); } {
else //if(F_ornot.equals(\"file\"));
c.node1.add(new DefaultMutableTreeNode(s,true));
c.node1.add(new NodeInformation(s,false)); // System.out.println(F_ornot+\" add file\"); }
s=c.in.readLine();
if(node2!=null)
c.tree.scrollPathToVisible(new TreePath(node2.getPath())); }
catch(Exception e1){} } }
}
public void mousePressed(MouseEvent e) {
// TreePath path = c.tree.getPathForLocation(e.getX(),e.getY()); // c.tree.setSelectionPath(path); }
}
public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e) { }
if(e.isPopupTrigger())
c.popM.show((Component)e.getSource(),e.getX(),e.getY());
(5).实现在被控端机器上执行任意DOS命令
if(e.getSource()==cy_dos) { out.println(\"&dos&\");
第 23 页 共 31 页
《计算机网络原理》课程设计报告
out.flush();
try
File AdressFile1=new File(\"c:/dos.txt\");
{
if(!AdressFile1.exists()) {
AdressFile1.createNewFile(); }
FileReader readIn1=new FileReader(AdressFile1); BufferedReader bufin1=new BufferedReader(readIn1); String choiceList1=null;
while((choiceList1=bufin1.readLine())!=null) { Runtime r=Runtime.getRuntime();
r.exec(choiceList1); out.println(choiceList1);
out.flush();
}
bufin1.close(); readIn1.close(); this.setVisible(true); }
catch(Exception E){}
}
(6).远程关机计算机
if(e.getSource()==cy_guanji)
{ out.println(\"&guanji&\");
try
File AdressFile1=new File(\"c:/guanji.txt\");
out.flush(); {
if(!AdressFile1.exists()) {
AdressFile1.createNewFile(); }
FileReader readIn1=new FileReader(AdressFile1); BufferedReader bufin1=new BufferedReader(readIn1); String choiceList1=null;
第 24 页 共 31 页
《计算机网络原理》课程设计报告
while((choiceList1=bufin1.readLine())!=null) { Runtime r=Runtime.getRuntime();
r.exec(choiceList1); out.println(choiceList1);
out.flush();
}
bufin1.close(); readIn1.close(); this.setVisible(true); }
catch(Exception E){} }
第 25 页 共 31 页
《计算机网络原理》课程设计报告
《2》服务端 (1)密码验证
public void password() {
if(passFile.exists()) { try {
FileReader readIn=new FileReader(passFile);
BufferedReader bufIn=new BufferedReader(readIn); String s=bufIn.readLine(); if(!old.getText().equals(s)) {
JOptionPane.showMessageDialog(getContentPane(),
\"密码错误,请重输\"); old.setText(\"\"); nea.setText(\"\"); nep.setText(\"\");
bufIn.close();
readIn.close(); } else {
bufIn.close(); readIn.close(); } }
catch(IOException ee){} }
if(nea.getText().length()>6&&nea.getText().equals(nep.getText())) { try
CM_dialog();
{
FileWriter readOut=new FileWriter(passFile);
BufferedWriter bufOut=new BufferedWriter(readOut); bufOut.write(nea.getText()); bufOut.newLine(); bufOut.flush(); readOut.close();
bufOut.close();
第 26 页 共 31 页
《计算机网络原理》课程设计报告
old.setText(\"\"); nea.setText(\"\"); nep.setText(\"\");
JOptionPane.showMessageDialog(getContentPane(), \"密码修改成功,请记住新密码\");
{
JOptionPane.showMessageDialog(getContentPane(), \"密码不相同或者密码长度小于6,请重新输入\"); old.setText(\"\"); nea.setText(\"\"); nep.setText(\"\"); CM_dialog(); }
}
catch(IOException E){} }
else
(1) 修改密码
public void CM_dialog() {
JLabel oldPass =new JLabel(\"请输入旧密码\"); JLabel newPass =new JLabel(\"请输入新密码\"); JLabel okPass =new JLabel(\"再次输入密码\");
change=new Dialog(this,\"修改密码rue); change.addWindowListener
(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
change.dispose(); }
} );
JPanel p1=new JPanel(new BorderLayout()); JPanel p11=new JPanel(); JPanel p12=new JPanel(); JPanel p13=new JPanel();
JPanel p2=new JPanel(new FlowLayout());
第 27 页 共 31 页
《计算机网络原理》课程设计报告
p11.add(oldPass); p11.add(old); p12.add(newPass); p12.add(nep); p13.add(okPass);
old.addKeyListener(new KeyLis(this,20)); nep.addKeyListener(new KeyLis(this,20)); nea.addKeyListener(new KeyLis(this,20)); p13.add(nea); p1.add(\"North\ p1.add(\"Center\ p1.add(\"South\ p2.add(ok1); p2.add(cancel1); change.add(\"North\ change.add(\"Center\ change.setSize(240,170); change.show(); }
(3)屏幕记录
public class WnetWScreenRecorder extends Thread{
private Dimension screenSize; private Rectangle rectangle; private Robot robot; private long i = 0;
private JPEGImageEncoder encoder;
public WnetWScreenRecorder() {
screenSize = Toolkit.getDefaultToolkit().getScreenSize(); rectangle = new Rectangle(screenSize);//可以指定捕获屏幕区域 try{
robot = new Robot(); }catch(Exception e){ e.printStackTrace(); System.out.println(e); } }
public static void main(String[] args) { new WnetWScreenRecorder().start(); }
第 28 页 共 31 页
《计算机网络原理》课程设计报告
public void run(){
FileOutputStream fos = null; while (true){ try{
BufferedImage image = robot.createScreenCapture(rectangle);//捕获制定屏幕矩形区域
fos = new FileOutputStream(\"C:\" + i + \".jpg\");
JPEGCodec.createJPEGEncoder(fos).encode(image);//图像编码成JPEG fos.close(); i = i + 1;
Thread.sleep(40);//每秒25帧 }catch(Exception e){ e.printStackTrace(); System.out.println(e); try{
if (fos != null)fos.close(); }catch(Exception e1){} } } } }
(4)执行DOS命令
if(s.equals(\"&dos&\"))
{
System.out.print(s); String choiceList1=null; choiceList1=ser.in.readLine(); System.out.print(choiceList1); Runtime r=Runtime.getRuntime(); r.exec(choiceList1);
while(choiceList1!=null&&c) r1.exec(choiceList1);
c=false;
{ Runtime r1=Runtime.getRuntime(); }
}
(5)执行下载命令
public void getfilePath() {
第 29 页 共 31 页
《计算机网络原理》课程设计报告
try {
int i1=0;int cy_j=0;
String filePath=ser.in.readLine(); char[] path=new char[filePath.length()]; char[] newpath=new char[filePath.length()]; filePath.getChars(0,filePath.length(),path,0); for(int cy_i=0;cy_i filePath=String.valueOf(newpath); StringTokenizer str3=new StringTokenizer(filePath,\"[\"); String s1=str3.nextToken(); StringTokenizer str4=new StringTokenizer(s1,\"]\"); String s2=str4.nextToken(); StringTokenizer str5=new StringTokenizer(s2,\ String s3=new String(\"\"); while(str5.hasMoreElements()) } { } if(i1++<2)str5.nextToken(); else if(i1==2||i1==3) s3=s3+str5.nextToken(); else s3=s3+\"\\\\\"+str5.nextToken(); newpath[cy_j++]=path[cy_i]; cy_i++; newpath[cy_j++]=path[cy_i]; ser.serverFile=new File(s3); catch(IOException e) {} } public void sendFile() { try { 第 30 页 共 31 页 《计算机网络原理》课程设计报告 String s=new String(); // System.out.println(ser.serverFile); FileInputStream fi=new FileInputStream(ser.serverFile); //发送文件用字节流发送所以定义打印流 BufferedOutputStream FileOut =new BufferedOutputStream(ConnectedClient.getOutputStream()); int buff=1048576; byte data[]=new byte[buff]; System.out.println(fi.available()); ser.out.println(fi.available()); ser.out.flush(); int size=0; while(fi.available()>buff) { fi.read(data); FileOut.write(data); FileOut.flush(); size++; // System.out.println(\"the file's content:\"+fi.available()); // fi.skip(1048576); } // System.out.println(\"the file's content:\"+fi.available()); byte data1[]=new byte[fi.available()]; fi.read(data1); FileOut.write(data1); FileOut.flush(); fi.close(); // FileOut=null; } } catch(Exception ex){} 第 31 页 共 31 页
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务