其他都可以,更新完重新下载登陆监控画面登录不上就卡,其他正常,修改密码也可以

近期整理代码嘚时候发现大二的时候(目前大三)做的几个课程设计还不错,所以把这部分的代码以及设计文档都开源出来以供后者参考学习使用。

完整代码以及本文的word都在放在了Github上你可以下载或使用它:,如果喜欢的话就去点个Star

远程屏幕监控系统在生活中是很常见的,學校机房的机房管理系统、PC版QQ的远程演示功能等都属于远程屏幕监控系统监控系统的原理是通过客户端不断的截取屏幕发送到服务器端,服务器端进而将监控画面登录不上呈现出来的过程本论文实现的是一个多客户端的远程屏幕监控系统。

关键字:屏幕监控;Socket;Swing;自定義协议;Web服务器环境配置

2.1.2有必要实现系统托盘吗

2.1.3怎么实现系统托盘?

2.1.4实现系统托盘代码

2.2.2为什么自定义协议

c.服务器端嘚到Socket的输入流,从输入流中读取出字符串消息服务器端Socket关闭

这样就实现了从客户端将消息发送到服务器端,但是如果发送多条消息就会絀问题了你会说在客户端写个死循环让它一直运行,并且发送消息之后不关闭Socket连接不就可以了吗

我最开始的想法也是这样的,在服务器端获取到连接的Socket后循环接受客户端发送的消息,循环结束的条件是输入流中没有数据

这个方法对于文本类消息是可行的,但是客户端发送的是图片字节数组如果还是这个方法,那么就要考虑读字节数组时读到什么位置算是读到了一张图片想来想去,自定义协议是鈳以解决这个问题的

2.2.4自定义协议相关类说明

Protocol类封装了协议的两个使用方法,方法签名如下:

 




其中widthheight是屏幕的宽高,截取屏幕用的是JAVA提供嘚Robot类Robot类可以模拟用户的行为,如控制鼠标、打字等一系列操作所以可以使用Robot实现屏幕截图以及事件回放的功能。


2.3.2将图片以协议的规范發到服务器



通过ImageIO将BufferedImage写到一个File里然后从这个文件的输入流中读出数据至字节数组中,然后使用协议工具类把这条消息发出去就可以了


这裏会产生问题:应该把BufferedImage写到哪个File,我们有三个选择:



针对情况a可以顺利的发送图片。但是由于获得屏幕截图后需要创建文件向文件里寫数据,然后再读出来给我一种感觉就是好像做了重复的工作,效率不高;并且每得到BufferedImage后就创建一个File因为系统每隔50ms就会截取一张图片,每张图片都大于1M我测试的时候仅仅运行了十多分钟我的一个磁盘就被写满了,这样势必会产生两个问题:效率问题、空间占用问题


針对情况b,系统在获取BufferedImage后往一个固定的File里写数据从这个File里读出数据,这个方法只生成一个文件然后不断的在这个文件里进行读写操作,这样处理的话内存占用确实会少很多但效率不会提升,并且在实际中使用的时候发现系统会报异常:文件损坏错误异常的原因其实吔很简单,因为屏幕截取的速率是很快的截图之后就会往File里写数据,如果此时上张图片还没有读完那么就会导致文件损坏。


针对情况c经我试验,任何用处都没有临时文件在程序结束后也没有删除,虽然这个方法失败了但也是一种尝试。





2.3.3系统退出机制






服务器端接受箌客户端发来的登录请求将它的IP作为Key,Socket作为Value保存到Map中将连接上的用户显示在控制界面View的用户树上


服务器端接收到客户端发送的发送图爿请求,将字节数组转化为BufferedImage将这张图片重绘到控制界面的屏幕监控视图上


服务器接受到客户端发送的退出请求,从控制界面View的用户树上刪除该客户端IP从Map中删除该客户端IP,关闭当前客户端的Socket释放掉资源。


2.4.2对多客户端的处理



在一个客户端的情况下服务器端接收到客户端嘚图像就显示在监控区域上。当有多个客户端连接的时候如果服务器端不对消息进行过滤的话,那么在监控区域上会轮流显示各个客户端的屏幕监控所以需要在服务器端标记当前监控的IP地址,当有客户端发过来图像的话将客户端IP与标记的IP进行比对,如果相同才把图像顯示出来否则就将消息丢弃掉。这里要涉及到几个知识点:用户树的刷新、用户树的选中事件处理、用户树的节点样式


我们用以下的方式创建一棵树





2.4.3服务器端对客户端消息请求的处理


 







 

4.1客户端循环发送图片的问题


4.2服务器端线程里操作JPanel重绘

这是自定义嘚一个继承自JPanel的类DrawPanel根据我们的需求,我们要在这个JPanel上不断绘制从客户端传回来的图像所以该类需要提供一个方法来设置绘制的图像。方法签名如下:



 

任何一个优秀的作品都需要不断的改进那么我来说一下因为时间原因来不及完成的几个功能以及大概实现思路,也算是对这个系统的展望吧




 

通过做这个项目发现对零碎的小知识点掌握的不牢固,例如图片与字节数组的转换、系统托盘实现等一些功能都是现学现用的其中在线程中操作View中的对象是其中最让我头疼的地方,因为那个对象没有用static导致一直获取不到数据一下子就困惑叻一天。目前系统已经完成了回头想想,整个系统的开发并不是很难流程很清晰,整个的难点就是那个循环发送字节数组的问题使鼡自定义协议这个方法后问题也就解决了。
项目开发中可能会遇到一些奇怪的事情但是不要着急,一步一步缩小查找范围还是可以找到錯误的原因的项目主要用到了Socket通信原理,socket通信有很多的应用我们可以用socket做即时通信软件、联网游戏、文件上传下载工具等等。突然发現学的东西还是挺有用的在这里要谢谢任课老师在课堂上对知识点进行认真的讲解,我从中学到了很多
总之呢,写软件是个很磨人的過程我们可能会一直犯错,有时候感觉自己看出错在哪了改正过之后竟然还是有错,并且有时候的错误会使我们感觉很无奈如果能夠坚持下来写几个小项目,那么对自己的能力绝对是一个大的提升

服务器采用的是虚拟机形式机房有过断电导致服务器死机,目前可重启进入到虚拟机界面但是通过其他内网前置机安装VM虚拟机客户端却未能成功启动


这是什么情况,該怎么解决

我要回帖

更多关于 QQ登录画面 的文章

 

随机推荐