安卓设备通过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 {
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 );
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) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
} catch (IOException e) {
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端的编码方式不同,只要在传输过程中统一编码方式即可。
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream(),"utf-8" )),true );
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream(),"utf-8" ));