您的位置:首页 > 移动开发 > Android开发

Android手机监控软件设计实现

2014-07-24 14:08 260 查看
一、需求分析:

随着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.服务器端(电脑)

Java代码

package cn.netjava7;

public class CharRoom {

/**

* 写一个服务器打开的程序

* @param port:端口

*/

public void startServer (int port){

try{

//建立一个Serverc 对象

java.net.ServerSocket sc=new java.net.ServerSocket(port);

System.out.println("服务器创建成功");

//开始不断地接收数据

while (true){

//建立一个联结对象

java.net.Socket client=sc.accept();

UserThread ust=new UserThread(client);

ust.init();

ust.start();

}

}catch(Exception ef){

ef.printStackTrace();

}

}

/**

* 主函数

*/

public static void main(String args[]){

CharRoom cr=new CharRoom();

cr.startServer(9090);

}

}

Java代码

package cn.netjava7;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Rectangle;

import java.awt.Robot;

import java.awt.Toolkit;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.io.DataOutputStream;

import java.io.IOException;

import javax.imageio.ImageIO;

import javax.swing.ImageIcon;

import javax.swing.JFrame;

public class UserThread extends Thread{

//定义构造器,传入对client

private java.net.Socket client;

private java.io.InputStream ins;

private java.io.OutputStream ous;

public UserThread(java.net.Socket client){

this.client=client;

}

//初始化

public void init(){

try {

ins=client.getInputStream();

ous=client.getOutputStream();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

//写run方法

public void run(){

try {

sendImg();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public void sendImg() throws Exception{

DataOutputStream dous=new DataOutputStream(ous);

Robot ro=new Robot();

Dimension scrSize=Toolkit.getDefaultToolkit().getScreenSize();

Rectangle r=new Rectangle(scrSize.width,scrSize.height);

System.out.println("大小是:"+scrSize.height+" "+scrSize.width);

while(true){

BufferedImage bui=ro.createScreenCapture(r);

ByteArrayOutputStream imageStream=new ByteArrayOutputStream();

boolean resultWrite = ImageIO.write(bui, "jpg", imageStream);

byte [] tagInfo=imageStream.toByteArray();

System.out.println(tagInfo.length);

System.out.println(tagInfo[0]+" "+tagInfo[1]);

Image img=Toolkit.getDefaultToolkit().createImage(tagInfo, 0,tagInfo.length);

dous.writeInt(tagInfo.length+5);

dous.writeByte((byte)4);

dous.write(tagInfo);

Thread.sleep(1000);

}

}

}

2.手机端:

Java代码

package cn.netjava;

import java.io.DataInputStream;

import android.app.Activity;

import android.content.Context;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.net.wifi.WifiManager;

import android.os.Bundle;

import android.os.Handler;

import android.os.Looper;

import android.os.Message;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ImageView;

import android.widget.TextView;

public class FunctionViewActivity extends Activity{

//定义各个stream

private java.io.InputStream ins;

private java.io.OutputStream ous;

private java.io.DataInputStream dins;

//定义各个组件

private ImageView img;

private TextView tvw;

//定义一个Bitmap 用来存ImageView的每个图

private Bitmap bmm;

//放接收到数据的数组

private byte[] data;

//初始化

public void init(String ip){

try{

System.out.println(ip);

java.net.Socket soc=new java.net.Socket(ip,9090);

ins=soc.getInputStream();

dins=new DataInputStream(ins);

ous=soc.getOutputStream();

System.out.println("创建成功!");

}catch(Exception ef){

ef.printStackTrace();

}

}

//内部类,myHandler

class MyHandler extends Handler{

public MyHandler(){

}

public MyHandler(Looper looper){

super(looper);

}

public void handleMessage(Message msg){

img.setImageBitmap((Bitmap)msg.obj);

}

}

//onCreate

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.mainfunctionactivity);

//得到各个组件

img=(ImageView)findViewById(R.id.imgView);

tvw=(TextView)findViewById(R.id.exitTextView);

//textView 添加监听器

tvw.setOnClickListener(new OnClickListener(){

public void onClick(View v) {

System.exit(0);

}

});

init(this.getIntent().getStringExtra("ipaddress"));

Looper looper = Looper.myLooper();

//此处甚至可以不需要设置Looper,因为 Handler默认就使用当前线程的Looper

final MyHandler myhandler= new MyHandler(looper);

new Thread() {

public void run() {

while(true){

try{

data=new byte[dins.readInt()-5];

dins.readByte();

//注意,这里要用readfully

dins.readFully(data);

//注意,这里要回收bmm ,否则报错

if (bmm!=null){

bmm.recycle();

}

bmm=BitmapFactory.decodeByteArray(data, 0, data.length);

System.out.println("decode after:"+System.currentTimeMillis());

//每一百ms 执行 (可调)

// Thread.sleep(100);

//创建一个Message对象,并把得到的天气信息赋值给Message对象

Message message = Message.obtain();

message.obj = (Bitmap)bmm;

myhandler.sendMessage(message);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}.start();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: