Android手机监控软件设计实现

时间:2022-12-27 18:13:10

一、需求分析:

随着IT信息技术的飞速发展,手机的普及,伴随着智能手机的出现及快速的更新换代,手机已不仅仅是一个通信工具,更是一个多功能的应用平台。

手机监控软件则是基于电脑监控软件的原理,植入手机平台的一款软件,由于手机具有良好的网络支持及出色的便携性,植入手机平台十分有现实意义。

二、概要设计:

服务器端:

1.          启动服务器,接收socket

2.          截取屏幕图像,压缩并编码发送

客户端:

1.          登陆服务器及验证

2.          接收服务器信息并解码显示

各个功能通过各自的类来完成。

三、详细设计:

1、手机客户端用ImageView来显示监控画面。

2、手机端使用线程完成接收信息、译码等费时操作。

3、完成Activity之间的数据传递。

4、使用流布局、相对布局等布局方式

5、使用布局与程序功能代码分离的设计方法

6、使用横向、全屏

四、程序结构

1、程序结构说明:

本程序采用模块化设计方法,各个功能的实现都有具体的方法,在主函数调用相应的方法即可实现程序的要求。程序的整体性很强。

2、重要数据说明:

程序通信中,使用字节流协议进行通信。

四个字节

一个字节

后N个字节

一个INT,代表信息长度

代表类型

信息

其中,类型:0代表图片类型数据 (针对客户端)

0代表移动命令     (针对服务器)

1代表鼠标点击命令 2代表鼠标释放命令

3代表键盘点击命令 4代表键盘释放命令

3、函数清单:

见代码

五、调试分析:

程序截图:

使用预览

欢迎界面

使用界面

六、源代码:

1.服务器端(电脑)

  1. package cn.netjava7;
  2. public class CharRoom {
  3. /**
  4. * 写一个服务器打开的程序
  5. * @param port:端口
  6. */
  7. public void startServer (int port){
  8. try{
  9. //建立一个Serverc 对象
  10. java.net.ServerSocket sc=new java.net.ServerSocket(port);
  11. System.out.println("服务器创建成功");
  12. //开始不断地接收数据
  13. while (true){
  14. //建立一个联结对象
  15. java.net.Socket client=sc.accept();
  16. UserThread ust=new UserThread(client);
  17. ust.init();
  18. ust.start();
  19. }
  20. }catch(Exception ef){
  21. ef.printStackTrace();
  22. }
  23. }
  24. /**
  25. * 主函数
  26. */
  27. public static void main(String args[]){
  28. CharRoom cr=new CharRoom();
  29. cr.startServer(9090);
  30. }
  31. }
  1. package cn.netjava7;
  2. import java.awt.Dimension;
  3. import java.awt.Graphics;
  4. import java.awt.Image;
  5. import java.awt.Rectangle;
  6. import java.awt.Robot;
  7. import java.awt.Toolkit;
  8. import java.awt.image.BufferedImage;
  9. import java.io.ByteArrayOutputStream;
  10. import java.io.DataOutputStream;
  11. import java.io.IOException;
  12. import javax.imageio.ImageIO;
  13. import javax.swing.ImageIcon;
  14. import javax.swing.JFrame;
  15. public class UserThread extends Thread{
  16. //定义构造器,传入对client
  17. private java.net.Socket client;
  18. private java.io.InputStream ins;
  19. private java.io.OutputStream ous;
  20. public UserThread(java.net.Socket client){
  21. this.client=client;
  22. }
  23. //初始化
  24. public void init(){
  25. try {
  26. ins=client.getInputStream();
  27. ous=client.getOutputStream();
  28. } catch (IOException e) {
  29. // TODO Auto-generated catch block
  30. e.printStackTrace();
  31. }
  32. }
  33. //写run方法
  34. public void run(){
  35. try {
  36. sendImg();
  37. } catch (Exception e) {
  38. // TODO Auto-generated catch block
  39. e.printStackTrace();
  40. }
  41. }
  42. public void sendImg() throws Exception{
  43. DataOutputStream dous=new DataOutputStream(ous);
  44. Robot ro=new Robot();
  45. Dimension scrSize=Toolkit.getDefaultToolkit().getScreenSize();
  46. Rectangle r=new Rectangle(scrSize.width,scrSize.height);
  47. System.out.println("大小是:"+scrSize.height+" "+scrSize.width);
  48. while(true){
  49. BufferedImage bui=ro.createScreenCapture(r);
  50. ByteArrayOutputStream imageStream=new ByteArrayOutputStream();
  51. boolean resultWrite = ImageIO.write(bui, "jpg", imageStream);
  52. byte [] tagInfo=imageStream.toByteArray();
  53. System.out.println(tagInfo.length);
  54. System.out.println(tagInfo[0]+" "+tagInfo[1]);
  55. Image img=Toolkit.getDefaultToolkit().createImage(tagInfo, 0,tagInfo.length);
  56. dous.writeInt(tagInfo.length+5);
  57. dous.writeByte((byte)4);
  58. dous.write(tagInfo);
  59. Thread.sleep(1000);
  60. }
  61. }
  62. }

2.手机端:

  1. package cn.netjava;
  2. import java.io.DataInputStream;
  3. import android.app.Activity;
  4. import android.content.Context;
  5. import android.graphics.Bitmap;
  6. import android.graphics.BitmapFactory;
  7. import android.net.wifi.WifiManager;
  8. import android.os.Bundle;
  9. import android.os.Handler;
  10. import android.os.Looper;
  11. import android.os.Message;
  12. import android.view.View;
  13. import android.view.View.OnClickListener;
  14. import android.widget.ImageView;
  15. import android.widget.TextView;
  16. public class FunctionViewActivity extends Activity{
  17. //定义各个stream
  18. private java.io.InputStream ins;
  19. private java.io.OutputStream ous;
  20. private java.io.DataInputStream dins;
  21. //定义各个组件
  22. private ImageView img;
  23. private TextView tvw;
  24. //定义一个Bitmap 用来存ImageView的每个图
  25. private Bitmap bmm;
  26. //放接收到数据的数组
  27. private byte[] data;
  28. //初始化
  29. public void init(String ip){
  30. try{
  31. System.out.println(ip);
  32. java.net.Socket soc=new java.net.Socket(ip,9090);
  33. ins=soc.getInputStream();
  34. dins=new DataInputStream(ins);
  35. ous=soc.getOutputStream();
  36. System.out.println("创建成功!");
  37. }catch(Exception ef){
  38. ef.printStackTrace();
  39. }
  40. }
  41. //内部类,myHandler
  42. class MyHandler extends Handler{
  43. public MyHandler(){
  44. }
  45. public MyHandler(Looper looper){
  46. super(looper);
  47. }
  48. public void handleMessage(Message msg){
  49. img.setImageBitmap((Bitmap)msg.obj);
  50. }
  51. }
  52. //onCreate
  53. public void onCreate(Bundle savedInstanceState) {
  54. super.onCreate(savedInstanceState);
  55. setContentView(R.layout.mainfunctionactivity);
  56. //得到各个组件
  57. img=(ImageView)findViewById(R.id.imgView);
  58. tvw=(TextView)findViewById(R.id.exitTextView);
  59. //textView 添加监听器
  60. tvw.setOnClickListener(new OnClickListener(){
  61. public void onClick(View v) {
  62. System.exit(0);
  63. }
  64. });
  65. init(this.getIntent().getStringExtra("ipaddress"));
  66. Looper looper = Looper.myLooper();
  67. //此处甚至可以不需要设置Looper,因为 Handler默认就使用当前线程的Looper
  68. final MyHandler  myhandler= new MyHandler(looper);
  69. new Thread() {
  70. public void run() {
  71. while(true){
  72. try{
  73. data=new byte[dins.readInt()-5];
  74. dins.readByte();
  75. //注意,这里要用readfully
  76. dins.readFully(data);
  77. //注意,这里要回收bmm ,否则报错
  78. if (bmm!=null){
  79. bmm.recycle();
  80. }
  81. bmm=BitmapFactory.decodeByteArray(data, 0, data.length);
  82. System.out.println("decode after:"+System.currentTimeMillis());
  83. //每一百ms 执行 (可调)
  84. //  Thread.sleep(100);
  85. //创建一个Message对象,并把得到的天气信息赋值给Message对象
  86. Message message = Message.obtain();
  87. message.obj = (Bitmap)bmm;
  88. myhandler.sendMessage(message);
  89. } catch (Exception e) {
  90. // TODO Auto-generated catch block
  91. e.printStackTrace();
  92. }
  93. }
  94. }
  95. }.start();
  96. }
  97. }

Android手机监控软件设计实现的更多相关文章

  1. Android手机安全软件的恶意程序检测靠谱吗--LBE安全大师、腾讯手机管家、360手机卫士恶意软件检测方法研究

    转载请注明出处,谢谢. Android系统开放,各大论坛活跃,应用程序分发渠道广泛,这也就为恶意软件的传播提供了良好的环境.好在手机上安装了安全软件,是否能有效的检测出恶意软件呢?下边针对LBE安全大 ...

  2. 如何获得Android手机的软件安装列表

    Android的PackageManager类用于检索目前安装在设备上的应用软件包的信息.你可以通过调用getpackagemanager()得到PackageManager类的一个实例.对查询和操作 ...

  3. Android手机_软件01

    1.微信 下载:http://weixin.qq.com/ 2.QQ 下载:http://im.qq.com/download/ 3.滴滴打车(乘客端):http://www.xiaojukeji.c ...

  4. Android手机_软件安装目录

    1. /data/data ==> 应该是 数据存放的位置 /data/app ==> 应该是 程序存放的位置 2.

  5. Android手机需要安装任务管理软件吗?

    使用android手机的用户可能都安装了任务管理的软件,使用android手机真的有必要安装结束任务的软件吗?大家在使用中也都发现了,很多软件在被结束后,马上就会又出现在任务列表里,或是稍等一会自己也 ...

  6. GPS部标平台的架构设计(六)-Android手机客户端和手机查车设计

    对于GPS软件平台,虽然有功能非常丰富的PC端或BS客户端,但是客户也是需要移动客户端来作为自己的辅助工具,也是需要的.做为GPS平台的设计者和开发者,在开发移动客户端的时候,也需要从常规的服务器开发 ...

  7. 无需Root实现Android手机屏幕流畅投影到电脑进行演示(附软件下载)

    近期要在公司的会议上演示App,须要在投影仪上显示出来给大家演示.因为投影仪不是智能投影仪,仅仅能将App先投影到自己的笔记本上.然后再将笔记本上的内容投影到投影仪上.该App是个游戏,实时交互性比較 ...

  8. Android针对不同的手机屏幕大小设计图片资源与编码

    注:本文转载于:http://blog.csdn.net/welovesunflower/article/details/7930248 一些术语 Screen Size 屏幕尺寸: 实际的物理尺寸, ...

  9. Android手机一键Root原理分析

    图/文 非虫 一直以来,刷机与Root是Android手机爱好者最热衷的事情.即使国行手机的用户也不惜冒着失去保修的风险对Root手机乐此不疲.就在前天晚上,一年一度的Google I/O大会拉开了帷 ...

随机推荐

  1. js,addEventListener参数传递

    解决方法 因为i相对匿名函数是外面的变量,就把循环绑定的时候,将i的值传入到匿名函数内,就可以了.因此需要在匿名函数(事件函数)外包裹一个匿名函数, 并立即执行. var elems = docume ...

  2. Log Buffer

    Log Buffer 一.Log Buffer的引入 Oracle有一个原则:只要是已经提交的数据,就不会丢失,保证数据库的一致性.这该如何实现?事物提交时,直接写入dbf中,效率是极低的.因为直接写 ...

  3. css做三角形

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  4. Linux command’s Array

    #数组的声明与遍历 animals=("a dog" "a cat" "a fish") #wrong ways to use this f ...

  5. gcc的-D和-U参数:宏的设置与取消 &lowbar;CCFLAGS&equals;&quot&semi; -w -enable-threads&equals;posix -DLINUX -D&lowbar;REENTRANT -DWORKONGN -Dlinux -D&lowbar;GN&lowbar;DETAIL&lowbar;SDR&lowbar;&quot&semi;

    _CCFLAGS=" -w -enable-threads=posix -DLINUX -D_REENTRANT -DWORKONGN -Dlinux -D_GN_DETAIL_SDR_&q ...

  6. c&plus;&plus;复习(未完待续)

    1.使函数不能在定义该函数的文件之外访问的方法: (1)声明函数为static(2)将函数放到无名名字空间中 namespace { void g() { ......... } }

  7. PHP ServerPush &lpar;推送&rpar; 技术

    用来代替ajax的请求 转自:http://blog.163.com/bailin_li/blog/static/17449017920124811524364/ 需求: 我想做个会员站内通知的功能. ...

  8. 数据库Mysql的安装及操作---数据引擎

    一.1.什么是数据           描述事物的符号记录称为数据.       2.什么是数据库         存放数据的仓库,只不过这个仓库在计算机上存储设备上. 二.Mysql的介绍     ...

  9. ps 处理gif

    ps打开gif后,做了修改(去掉了背景色),但之后发现本来是动图的gif不动了. 解决该问题需要注意两点: 一:保存时,要选择保存为web格式 二:在ps中打开时间轴,在时间轴中选中某一帧时,只能有多 ...

  10. SpringBoot&lpar;10&rpar; Servlet3&period;0的注解:自定义原生Servlet、自定义原生Listener

    一.自定义原生Servlet 1.启动类里面增加注解 @ServletComponentScan 2.Servlet上添加注解  @WebServlet(name = "userServle ...