前阵子做了个远程监控的小软件([url=http://wenwen.soso.com/z/q251858126.htm]http://wenwen.soso.com/z/q251858126.htm[/url])遇到了难题,就是我所在的局域网外网IP是动态的,从而无法用Socket连接外面的客户端了。昨晚无意中翻出了半年前用JavaMail写的邮件收发管理客户端,突然想到了似乎可以用邮箱服务器“代理”。于是兴奋得一夜没合眼,终于尝试着实现了这个想法。根本核心是完全用javamail收发邮件替代了socket通讯。
基本思路是:
[list]
[*]①首先实现邮件收发的功能
[*]②其次根据服务器对客户端的控制要求在客户端封装对应的方法
比如“截屏”是用Robot类的createScreenCapture(...)方法实现的。
还有一些调用外部命令如“CMD”之类的等等
[*]③这些控制方法如何根据收到的邮件来调用了?这就得定义预先一套规则来
截取邮件中的文本内容按照规则来调用对应的方法
比如“{命令:tasklist > c:/task.txt}”指的是将客户端当前系统的进程列表打印输出保存到C盘根目录下的task.txt文件中。一对 “{...}”代表一条指令,“命令”代表该指令是CMD命令。
[*]④为了客户端实时地被服务器监控,就得另外启动一个线程死循环不断地获取邮件列表,发现服务器发过来的新邮件就自动读取按照规则来处理。
[*]⑤最好为每个动作都分配一个线程来控制,因为不止一条指令,如果单线程的话就得一个个排队等待执行了。
[*]⑥javamail和socket的利与弊
对于本软件而言,用javamail的好处是不需要实现服务器端,只要可以上网收发邮件就行,也可以用手机根据邮件来控制客户端电脑。坏处是实时性差,因为有些邮箱服务器的设置限制了邮件列表的刷新率。今天我共注册了3个163邮箱,两个报废了,因为我把获取邮件列表的刷新率设置为最大值既没有sleep线程等待的方法。导致163邮箱服务器把这两个邮箱的POP给限制了,只能发邮件而不能接收。用socket响应迅速,可以实现远程协助,这是javamail而不能做到的。
[/list]
下面是几张操作过程中的截图:
[img]http://dl.iteye.com/upload/attachment/402620/577e0b92-1303-3a9e-b870-d7b1d273fdc7.png[/img]
[color=indigo]图1、向客户端发送邮件指令[/color]
[img]http://dl.iteye.com/upload/attachment/402618/f0745e13-b33f-3649-bf8e-ad72c9508b59.png[/img]
[color=indigo]图2、客户端接收到指令并相应[/color]
[img]http://dl.iteye.com/upload/attachment/402624/33cb1641-f687-3165-811c-3cb356b5eb1e.png[/img]
[color=indigo]图3、客户端向服务器的反馈附件[/color]
下面介绍几条指令:
[color=red]{错误:Ox4fadde9c"指令引用的"Oxffffffff"内存.该内存不能为"read"}[/color]在客户端弹出错误对话框“:”后面的是内容,这是模仿windows弹出的内存错误对话框。像此类对话框还有警告、消息等,如是消息则格式为{消息:消息内容}
[color=red]{命令:md c:/temp}[/color]cmd命令创建目录temp
[color=red]{命令:attrib +h c:/temp}[/color]隐藏目录temp
[color=red]{命令:dir > c:/temp/dir.txt}[/color]将当前目录下的子目录和文件列表信息输出到dir.txt中
[color=red]{命令:netstat -an > c:/temp/port.txt}[/color]将客户端系统端口信息写入到port.txt
[color=red]{命令:taskkill /im QQ.exe /T /F }[/color]结束QQ进程
[color=red]{截图:c:/temp/temp.png}[/color]截屏保存为temp.png
[color=red]{附件:c:/temp/dir.txt;c:/temp/port.txt;c:/temp/temp.png}[/color]将这些文件作为附件发往服务器
[color=red]{命令:rd /q /s c:\temp}[/color]删除目录temp
每条指令以“{”开始,并以“}”结束
每条指令的第一个“:”前面是指令的类型
测试的时候闹出了笑话,截取这几张图的时候,狂按十几下QQ截图快捷键竟然没反应。原来是QQ进程已经被干掉了,折腾了好久才发现的,狂汗-_-|||
最后用手机邮箱向我的电脑客户端邮箱发送了一条指令{命令:shutdown -s},结果测试通过了电脑关闭了。
主要知识点:javamail的运用,cmd常见命令等
扩充:增加一个服务器端,客户端也加些东西即客户端程序“注册”随系统启动,启动后自动向服务器邮箱发送上线通知提醒服务器。服务器这边随时监听,收到通知语音提示。
至此花了一天一夜没合眼,总算圆满的完成了,兴奋中……泡杯咖啡,VS杀人去……
基本思路是:
[list]
[*]①首先实现邮件收发的功能
[*]②其次根据服务器对客户端的控制要求在客户端封装对应的方法
比如“截屏”是用Robot类的createScreenCapture(...)方法实现的。
还有一些调用外部命令如“CMD”之类的等等
[*]③这些控制方法如何根据收到的邮件来调用了?这就得定义预先一套规则来
截取邮件中的文本内容按照规则来调用对应的方法
比如“{命令:tasklist > c:/task.txt}”指的是将客户端当前系统的进程列表打印输出保存到C盘根目录下的task.txt文件中。一对 “{...}”代表一条指令,“命令”代表该指令是CMD命令。
[*]④为了客户端实时地被服务器监控,就得另外启动一个线程死循环不断地获取邮件列表,发现服务器发过来的新邮件就自动读取按照规则来处理。
[*]⑤最好为每个动作都分配一个线程来控制,因为不止一条指令,如果单线程的话就得一个个排队等待执行了。
[*]⑥javamail和socket的利与弊
对于本软件而言,用javamail的好处是不需要实现服务器端,只要可以上网收发邮件就行,也可以用手机根据邮件来控制客户端电脑。坏处是实时性差,因为有些邮箱服务器的设置限制了邮件列表的刷新率。今天我共注册了3个163邮箱,两个报废了,因为我把获取邮件列表的刷新率设置为最大值既没有sleep线程等待的方法。导致163邮箱服务器把这两个邮箱的POP给限制了,只能发邮件而不能接收。用socket响应迅速,可以实现远程协助,这是javamail而不能做到的。
[/list]
下面是几张操作过程中的截图:
[img]http://dl.iteye.com/upload/attachment/402620/577e0b92-1303-3a9e-b870-d7b1d273fdc7.png[/img]
[color=indigo]图1、向客户端发送邮件指令[/color]
[img]http://dl.iteye.com/upload/attachment/402618/f0745e13-b33f-3649-bf8e-ad72c9508b59.png[/img]
[color=indigo]图2、客户端接收到指令并相应[/color]
[img]http://dl.iteye.com/upload/attachment/402624/33cb1641-f687-3165-811c-3cb356b5eb1e.png[/img]
[color=indigo]图3、客户端向服务器的反馈附件[/color]
下面介绍几条指令:
[color=red]{错误:Ox4fadde9c"指令引用的"Oxffffffff"内存.该内存不能为"read"}[/color]在客户端弹出错误对话框“:”后面的是内容,这是模仿windows弹出的内存错误对话框。像此类对话框还有警告、消息等,如是消息则格式为{消息:消息内容}
[color=red]{命令:md c:/temp}[/color]cmd命令创建目录temp
[color=red]{命令:attrib +h c:/temp}[/color]隐藏目录temp
[color=red]{命令:dir > c:/temp/dir.txt}[/color]将当前目录下的子目录和文件列表信息输出到dir.txt中
[color=red]{命令:netstat -an > c:/temp/port.txt}[/color]将客户端系统端口信息写入到port.txt
[color=red]{命令:taskkill /im QQ.exe /T /F }[/color]结束QQ进程
[color=red]{截图:c:/temp/temp.png}[/color]截屏保存为temp.png
[color=red]{附件:c:/temp/dir.txt;c:/temp/port.txt;c:/temp/temp.png}[/color]将这些文件作为附件发往服务器
[color=red]{命令:rd /q /s c:\temp}[/color]删除目录temp
每条指令以“{”开始,并以“}”结束
每条指令的第一个“:”前面是指令的类型
测试的时候闹出了笑话,截取这几张图的时候,狂按十几下QQ截图快捷键竟然没反应。原来是QQ进程已经被干掉了,折腾了好久才发现的,狂汗-_-|||
最后用手机邮箱向我的电脑客户端邮箱发送了一条指令{命令:shutdown -s},结果测试通过了电脑关闭了。
主要知识点:javamail的运用,cmd常见命令等
扩充:增加一个服务器端,客户端也加些东西即客户端程序“注册”随系统启动,启动后自动向服务器邮箱发送上线通知提醒服务器。服务器这边随时监听,收到通知语音提示。
至此花了一天一夜没合眼,总算圆满的完成了,兴奋中……泡杯咖啡,VS杀人去……