基于JavaGUI的远程屏幕监控软件系统

目录
摘要…………………………………………………………………………………1
一、项目分析………………………………………………………………………2
1.1需求性分析
1.2可行性分析
1.3技术点分析
二、功能实现………………………………………………………………………3
2.1系统托盘模块……………………………………………………………3
2.1.1系统托盘是个什么东西?
2.1.2有必要实现系统托盘吗?
2.1.3怎么实现系统托盘
2.1.4实现系统托盘代码
2.2自定义协议………………………………………………………………5
2.2.1网络协议
2.2.2为什么自定义协议?
2.2.3自定义协议
2.2.4自定义协议相关类说明
2.2.5核心代码
2.3客户端模块………………………………………………………………7
2.3.1获取屏幕截图
2.3.2将图片以协议的规范发到服务器
2.3.3系统退出机制
2.3.4客户端代码
2.4服务器端模块……………………………………………………………9
2.4.1服务器逻辑
2.4.2对多客户端的处理
2.4.3服务器端对客户端消息请求的处理

三、Web服务器环境配置………………………………………………………11
3.1简述
3.2工具
3.3搭建过程
3.4使用方法
四、项目难点……………………………………………………………………12
4.1客户端循环发送图片的问题
4.2服务器端线程里操作JPanel重绘
4.3对异常的处理
五、展望…………………………………………………………………………14
六、感想…………………………………………………………………………15
附件:软件运行效果图…………………………………………………………16

一、项目分析
1.1需求性分析
项目的初始阶段就是对整个系统进行预估,这有利于我们对整个系统的理解,屏幕监控系统需要实现的功能有:
a.客户端登录、退出
b.客户端截屏以及连续发送图像
c.客户端系统托盘功能
d.服务器端连续接收图像以及客户端其他请求
e.服务器端显示连接用户的用户树
f.客户端退出后用户树刷新
g.客户端发送图像后显示在服务器端
1.2可行性分析
需求性分析里提到的功能能否实现呢?我们在这里进行讨论:
a.通过构造自定义协议实现,都是通过将这些请求构造成协议从而发送到服务器
b.截屏功能通过Robot类实现,然后将BufferedImage转化为字节数组输出流,再转化为字节数组,并以协议的方式发送到服务器实现图像的连续发送。
c.使用系统托盘对象SystemTray来实现。
d.可以通过自定义协议工具类提供的解析数据的方法解析出数据,并根据消息类型进行相应的处理。
e.用户树使用JTree实现,DefaultTreeCellRenderer可以设置树的外观,为JTree设置节点选中监听器可以监听节点选中事件
f. 用DefaultTreeModel的reload()方法实现
g.可以自定义JPanel,通过paint(g)方法绘制图片
1.3技术点分析
Socket
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,java的API提供了对Socket的支持。

自定义网络协议
网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。为了满足我们的需求,我们需要自定义一个协议,并为其提供发送消息、解析消息的功能。
系统托盘
系统托盘是个特殊区域,通常在桌面的底部,项目中涉及到了对系统托盘的一些操作,我们为客户端提供系统托盘功能,可以方便用户关闭监控。
IO流
流是一种抽象概念,它代表了数据的无结构化传递。按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列。从流中取得数据的操作称为提取操作,而向流中添加数据的操作称为插入操作,用来进行输入输出操作的流就称为IO流。换句话说,IO流就是以流的方式进行输入输出。我们主要使用的有DataOutputStream、DataInputSream、ByteArrayoOutputStream等。

package Server;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

public class Server {
    
    
	public Map<String,Socket> client=new HashMap<>();
	public Map<String,Socket> clientManager=new HashMap<>();
	public static void main(String[] args) {
    
    
		try {
    
    
			ServerSocket serverSocket=new ServerSocket(33000);
			Server server=new Server();
			while(true){
    
    
				Socket socket=serverSocket.accept();
				DataInputStream dis=new DataInputStream(socket.getInputStream());
				String power=dis.readUTF();
				String clientKey="client"+socket.getInetAddress().getAddress();
				String managerKey="manager"+socket.getInetAddress().getAddress();
				if(power!=null&&power.equals("client")){
    
    
					if(!server.client.containsKey(clientKey)) server.client.put(clientKey,socket);
					new Thread(new HandleClient(socket)).start();
				}else{
    
    
					if(!server.clientManager.containsKey(managerKey)) server.clientManager.put(managerKey,socket);
					new Thread(new HandleManager(socket)).start();
				}
			}
			
		} catch (IOException e) {
    
    
			e.printStackTrace();
		}
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/newlw/article/details/132706671