Android手机监控软件设计实现

一、需求分析:

随着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手机的软件安装列表


下一篇:Labview 查看一次while循环运行的时间