Android手机监控软件设计实现
2014-07-24 14:08
260 查看
一、需求分析:
随着IT信息技术的飞速发展,手机的普及,伴随着智能手机的出现及快速的更新换代,手机已不仅仅是一个通信工具,更是一个多功能的应用平台。
手机监控软件则是基于电脑监控软件的原理,植入手机平台的一款软件,由于手机具有良好的网络支持及出色的便携性,植入手机平台十分有现实意义。
二、概要设计:
服务器端:
1. 启动服务器,接收socket
2. 截取屏幕图像,压缩并编码发送
客户端:
1. 登陆服务器及验证
2. 接收服务器信息并解码显示
各个功能通过各自的类来完成。
三、详细设计:
1、手机客户端用ImageView来显示监控画面。
2、手机端使用线程完成接收信息、译码等费时操作。
3、完成Activity之间的数据传递。
4、使用流布局、相对布局等布局方式
5、使用布局与程序功能代码分离的设计方法
6、使用横向、全屏
四、程序结构
1、程序结构说明:
本程序采用模块化设计方法,各个功能的实现都有具体的方法,在主函数调用相应的方法即可实现程序的要求。程序的整体性很强。
2、重要数据说明:
程序通信中,使用字节流协议进行通信。
其中,类型: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();
}
}
随着IT信息技术的飞速发展,手机的普及,伴随着智能手机的出现及快速的更新换代,手机已不仅仅是一个通信工具,更是一个多功能的应用平台。
手机监控软件则是基于电脑监控软件的原理,植入手机平台的一款软件,由于手机具有良好的网络支持及出色的便携性,植入手机平台十分有现实意义。
二、概要设计:
服务器端:
1. 启动服务器,接收socket
2. 截取屏幕图像,压缩并编码发送
客户端:
1. 登陆服务器及验证
2. 接收服务器信息并解码显示
各个功能通过各自的类来完成。
三、详细设计:
1、手机客户端用ImageView来显示监控画面。
2、手机端使用线程完成接收信息、译码等费时操作。
3、完成Activity之间的数据传递。
4、使用流布局、相对布局等布局方式
5、使用布局与程序功能代码分离的设计方法
6、使用横向、全屏
四、程序结构
1、程序结构说明:
本程序采用模块化设计方法,各个功能的实现都有具体的方法,在主函数调用相应的方法即可实现程序的要求。程序的整体性很强。
2、重要数据说明:
程序通信中,使用字节流协议进行通信。
四个字节 | 一个字节 | 后N个字节 |
一个INT,代表信息长度 | 代表类型 | 信息 |
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();
}
}
相关文章推荐
- Android手机监控软件设计实现
- Android HAL实现的三种方式(3) - 基于Manager的HAL设计
- 从零开始Android游戏编程(第二版) 第八章 地图的设计和实现
- Android Binder设计与实现 – 设计篇
- Android Binder设计与实现 - 设计篇
- Android常用三栏式滑动/滚动视图(View)的设计与实现代码
- Android HAL实现的三种方式(1) - 基于JNI的简单HAL设计 推荐
- Android - 底部菜单架构设计及封装实现
- Android Binder机制の设计与实现6-7(Binder 内存映射和接收缓存区管理/Binder 接收线程管理)
- Android Binder机制の设计与实现5(Binder 的表述)
- Android HAL实现的三种方式(2) - 基于Service的HAL设计
- Android HAL实现的三种方式- 基于JNI的简单HAL设计
- Android Binder机制の设计与实现1-3(引言/面向对象的 Binder IPC/Binder 通信模型)
- Android HAL实现的三种方式(2) - 基于Service的HAL设计 推荐
- Android Binder机制の设计与实现8-9(数据包接收队列与等待队列管理/总结)
- android适配器模式设计与实现
- Android Bander设计与实现 - 设计篇
- android实验四 QR码生成器的设计与实现
- android实验二 图片查看器的设计与实现
- Android Widget进阶——桌面便笺程序实例的实现流程与美化设计(图)