最近项目中有一个功能需要用到Android与PC端同步数据。查阅了相关资料后,采取了一种建立在adb基础之上的Usb通信方式:由于adb可以将Usb模拟为网卡,所以可以利用socket通信的方式实现Android与PC机的通信,以完成同步功能。
一、Android与PC通信的实现
在《PC客户端与Android服务端的Sockect同步通信》一文详细介绍了建立在adb基础之上的usb(socket)实现的具体方法。大体上的思路如下:
①Android作为server,侦探socket连接请求;添加一个服务类来实现侦听功能。
②PC端作为Client,请求建立socket连接。
③Android端添加一个广播接收类,接受PC端通过Adb发送的广播消息,以启动或者停止①中添加的服务。
④PC端通过Adb发送广播消息通知Android端启动或停止用来侦听socket连接的服务。1、PC端通过Adb发送广播,使Android端开启侦听Socket的服务,然后再请求连接。代码如下:
//连接
public bool DoConnect()
{
string strCmd = 'adb shell am broadcast -a NotifyServiceStop';
Execute(strCmd, wait_ms);
Thread.Sleep(wait_ms);
strCmd = 'adb forward tcp:12580 tcp:10086';
Execute(strCmd, wait_ms);
Thread.Sleep(wait_ms);
strCmd = 'adb shell am broadcast -a NotifyServiceStart';
Execute(strCmd, wait_ms);
Thread.Sleep(wait_ms);
IPAddress ipaddress = IPAddress.Parse('127.0.0.1');
tcpClient.Connect(ipaddress, 12580);
Thread.Sleep(wait_ms);
if (tcpClient != null)
{
NetworkStream networkkStream = tcpClient.GetStream();
networkkStream.ReadTimeout = timeOut;
networkkStream.WriteTimeout = timeOut;
reader = new BinaryReader(networkkStream);
writer = new BinaryWriter(networkkStream);
return true;
}
else
return false;
}其中,Execute()函数用来执行cmd命令,private string Execute(string command, int seconds)
{
string output = ''; //输出字符串
if (command != null && !command.Equals(''))
{
Process process = new Process();//创建进程对象
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = 'cmd.exe';//设定需要执行的命令
startInfo.Arguments = '/C ' + command;//“/C”表示执行完命令后马上退出
startInfo.UseShellExecute = false;//不使用系统外壳程序启动<