最近项目有一个需求,android PDA无法使用有线与无线网络,只能使用USB线,需要业务需通过sqlite处理好后同步到服务器上。
设计思路:PDA将数据同步到电脑上,电脑同步到服务器上
1.android 《======》 pc
采取了一种建立在adb基础之上的Usb通信方式:由于adb可以将Usb模拟为网卡,所以可以利用socket通信的方式实现Android与PC通信,以完成同步功能

一、Android作为server,侦探socket连接请求;添加一个服务类来实现侦听功能。二、PC端作为Client,请求建立socket连接。三、Android端添加一个广播接收类,接受PC端通过Adb发送的广播消息,以启动或者停止①中添加的服务。四、PC端通过Adb发送广播消息通知Android端启动或停止用来侦听socket连接的服务

a、android 端
1.AndroidManifest.xml注册服务监听USB接入事件

 <service     android:name=".service.BettyService"     android:enabled="true"     android:exported="true" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" />

2.android服务

package com.cmeim.pcp.demodata.service;import android.app.Service;import android.content.Intent;import android.os.IBinder;import com.cmeim.pcp.demodata.net.SocketServerThread;public class BettyService extends Service {        public BettyService() {    }    @Override    public IBinder onBind(Intent intent) {        // TODO: Return the communication channel to the service.        return null;    }    @Override    public void onCreate() {        super.onCreate();        new Thread(new SocketServerThread()).start();           }}

3.socket服务端

package com.cmeim.pcp.demodata.net;import android.util.Log;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;public class SocketServerThread extends Thread {    private BufferedOutputStream out;    private Socket client;    private ServerSocket serverSocket;    private static final int SERVER_PORT = 20000;    @Override    public void run() {        try {            if (serverSocket != null) {                return;            }            serverSocket = new ServerSocket(SERVER_PORT);            client = serverSocket.accept();            out = new BufferedOutputStream(client.getOutputStream());            syncSendMsg();            // 开启子线程去读去数据            BufferedInputStream bufferedInputStream = new BufferedInputStream(client.getInputStream());            String msg = readMsgFromSocket(bufferedInputStream);            Log.e("PC同步到android的数据", msg);        } catch (IOException e) {            e.printStackTrace();        }    }    //读取PC端发送过来的数据    private String readMsgFromSocket(InputStream in) {        String msg = "";        byte[] temp = new byte[1024 * 1024 * 10];        try {            int readBytes = in.read(temp, 0, temp.length);            msg = new String(temp, 0, readBytes, "utf-8");        } catch (Exception e) {            e.printStackTrace();        }        return msg;    }    //发送消息    public void syncSendMsg() throws IOException {        out.write(("pda-data:同步数据").getBytes("UTF-8"));        out.flush();    }    public void close() {        try {            if (serverSocket != null) {                serverSocket.close();            }            if (out != null) {                out.close();            }            if (client != null) {                client.close();            }        } catch (Exception e) {        }    }}

4.activity启动服务

  protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Intent intent= new Intent(this, BettyService.class);        startService(intent);// 启动服务  }

b.net客户端代码

 public AsycData()        { Process p = new Process(); //实例一个Process类,启动一个独立进程            p.StartInfo.FileName = "cmd.exe"; //设定程序名            p.StartInfo.UseShellExecute = false; //关闭Shell的使用            p.StartInfo.RedirectStandardInput = true; //重定向标准输入            p.StartInfo.RedirectStandardOutput = true; //重定向标准输出            p.StartInfo.RedirectStandardError = true; //重定向错误输出            p.StartInfo.CreateNoWindow = true; // 设置不显示窗口            p.StartInfo.ErrorDialog = false;            p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;            p.Start();            Thread thread = new Thread(initSocket);            thread.Start();}public TcpClient tcpClient=new TcpClient();        //连接        public bool DoConnect()        {            IPAddress ipaddress = IPAddress.Parse("127.0.0.1");            try            {                tcpClient.Connect(ipaddress, 12580);            }            catch (Exception e)            {                MessageBox.Show("网络连接失败");                return false;            }                      Thread.Sleep(10);            if (tcpClient != null)            {                        return true;            }            else                MessageBox.Show("网络连接失败");            return false;        } public void initSocket()        {                       if (DoConnect())            {                byte[] resut = new byte[1024 * 1024 * 10];                int data = 0;                NetworkStream networkStream = tcpClient.GetStream();                //同步数据                while ((data= networkStream.Read(resut, 0, resut.Length)) > 0)                {                    String message = Encoding.UTF8.GetString(resut, 0, data);//只将接收到的数据进行转化                    //接收到数据                    if (message.Contains("pda-data:"))                    {                        MessageBox.Show(message);                        byte[] outBound = Encoding.UTF8.GetBytes("PC已经收到消息了");                        networkStream.Write(outBound, 0, outBound.Length);                    }                }                           }        }

c.adb启动命令

shell am broadcast -a NotifyServiceStopadb forward tcp:12580 tcp:20000adb shell am broadcast -a NotifyServiceStart


adb插件直接将android SDK里面的platform-tools文件夹拷出来,编写一个启动命令
测试流程:1连接USB
2.启动测试app
3.运行adb启动命令行
4.运行.net程序
结果:安卓数据发送桌面应用上,桌面应用数据发送到android应用上,实现数据同步只需要将数据转化成json,队应的程序执行响应的逻辑处理即可实现数据同步

源码文件:链接:https://pan.baidu.com/s/1VIbvroP1OIZ0RT9fqMXGyg
提取码:490g

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. 【Android快捷开发笔记系列】——Data Binding
  3. Android(安卓)启动另一个App/apk中的Activity实现代码
  4. Android中使用Volley开源库进行Http网络请求(GET方式)
  5. android之SQLite数据库应用(二)
  6. [转]android 修改ramdisk.img和init.rc && android启动后设置/da
  7. Android使用Sqlite存储数据用法示例
  8. Android中ListView动态加载数据 加载中
  9. 【android】音乐播放器之service服务设计

随机推荐

  1. 59. Android(安卓)静态分析插件
  2. android中连接到指定wifi
  3. Android(安卓)istview顶部的或底部的渐变
  4. [置顶] android 设置边框圆角
  5. android 防止键盘弹出的简单方法
  6. Android(安卓)SystemUI任务栏修改
  7. android indication
  8. Android颜色渐变的分隔线(ListView)
  9. android 中 checkBox 的使用
  10. Android(安卓)深入研究LBS(基于位置的服务