安卓设备通过USB接口实现与pc端的简单数据通信

安卓设备通过USB接口实现与pc端的简单数据通信

最近突发奇想,想实现手机和电脑的交互,但考虑到网络限制,想要基于USB数据线实现与pc的通信,查阅很多资料,最终初步实现。以下某些思路来源于网络,大部分是自己写的,自我总结一番。

实现思路:

  • 通过adb命令转接端口
  • 安卓客户端作为Server,监听socket请求
  • pc端为client,请求socket连接

adb下载链接

PC端代码:


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Test {

    final static Scanner s = new Scanner(System.in);

    public static void main(String[] args) {
        try {
            // 这句adb命令可以不用.执行下面两句也可以实现转发.只是为了避免重复开启service所以在转发端口前先stop一下   
            Runtime.getRuntime().exec("adb shell am broadcast -a NotifyServiceStop");
            //转发的关键代码
            Runtime.getRuntime().exec("adb forward tcp:8000 tcp:2580");
            Runtime.getRuntime().exec("adb shell am broadcast -a NotifyServiceStart");

            new Thread(){
                @Override
                public void run() {

                    try {
                        Socket socket = new Socket("127.0.0.1", 8000);
                        // 将信息通过这个对象来发送给Server
                        PrintWriter out = new PrintWriter(new BufferedWriter(
                                new OutputStreamWriter(socket.getOutputStream(),"utf-8")),
                                true);

                        // 接收服务器信息
                        BufferedReader in = new BufferedReader(
                                new InputStreamReader(socket.getInputStream(),"utf-8"));

                        //首先发送请求类型
                        String msg="我来自电脑!";
                        msg = s.nextLine();
                        out.println(msg);
                        out.flush();

                        msg = in.readLine();
                        System.out.println(msg);

                    } catch (UnknownHostException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                    }

                }
            }.start();
        } catch (IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }

    }
}

Android端代码:

package com.example.cjh.news.ADB;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import com.example.cjh.news.R;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Main2Activity extends AppCompatActivity {

    private static final String TAG = "ServerThread";

    private TextView textView ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        textView = (TextView) findViewById(R.id.text1);

        new ServerThread().start();

    }

    class ServerThread extends Thread {



        @Override
        public void run() {
            Log.d(TAG, "running");

            ServerSocket serverSocket = null;
            try {
                serverSocket = new ServerSocket(2580);
                Log.d("TAG", "等待连接");
                while (true) {
                    Socket client = serverSocket.accept();

                    // 接受客户端信息
                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(client.getInputStream()));

                    // 发送给客户端的消息
                    PrintWriter out = new PrintWriter(new BufferedWriter(
                            new OutputStreamWriter(client.getOutputStream())),true);

                    final String msg = in.readLine();
                    Log.d(TAG,"msg = "+msg);

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            textView.setText(msg);
                        }
                    });

                    out.println("Server say:"+msg);
                    out.flush();
                    Log.d(TAG, "accept");

                    client.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                Log.d(TAG, "destory");

                if (serverSocket != null) {
                    try {
                        serverSocket.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

最终效果图

这里写图片描述

这里写图片描述

注:

第一次测试的时候出现了乱码,原因是安卓端和pc端的编码方式不同,只要在传输过程中统一编码方式即可。

// 将信息通过这个对象来发送给Server
PrintWriter out = new PrintWriter(new BufferedWriter(
    new OutputStreamWriter(socket.getOutputStream(),"utf-8")),true);

// 接收服务器信息
BufferedReader in = new BufferedReader(
    new InputStreamReader(socket.getInputStream(),"utf-8"));

猜你喜欢

转载自blog.csdn.net/qq_37063860/article/details/79822499