一、需求分析:
随着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.服务器端(电脑)
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); } }
?
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.手机端:
?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(); } }
?
?
求交流~
QQ:275924561 h或者发我QQ邮箱也可以!275924561@qq.com