客户端与Android服务端的Socket同步通信.docx
- 文档编号:674523
- 上传时间:2022-10-12
- 格式:DOCX
- 页数:47
- 大小:29.76KB
客户端与Android服务端的Socket同步通信.docx
《客户端与Android服务端的Socket同步通信.docx》由会员分享,可在线阅读,更多相关《客户端与Android服务端的Socket同步通信.docx(47页珍藏版)》请在冰豆网上搜索。
客户端与Android服务端的Socket同步通信
PC客户端与Android服务端的Socket同步通信(USB)收藏
需求:
1.一个android端的service后台运行的程序,作为socket的服务器端;用于接收Pcclient端发来的命令,来处理数据后,把结果发给PCclient
2.PC端程序,作为socket的客户端,用于给android手机端发操作命令
难点分析:
1.手机一定要有adb模式,即插上USB线时马上提示的对话框选adb。
好多对手机的操作都可以用adb直接作。
不过,我发现LGGW880就没有,要去下载个
2.android默认手机端的IP为“127.0.0.1”
3.要想联通PC与android手机的sokcet,一定要用adbforward来作下端口转发才能连上socket.
viewplaincopytoclipboardprint?
Runtime.getRuntime().exec("adbforwardtcp:
12580tcp:
10086");
Thread.sleep(3000);
Runtime.getRuntime().exec("adbforwardtcp:
12580tcp:
10086");
Thread.sleep(3000);
4.android端的service程序Install到手机上容易,但是还要有方法来从PC的client端来启动手机上的service,这个办法可以通过PC端adb命令来发一个Broastcast,手机端再写个接收BroastcastReceive来接收这个Broastcast,在这个BroastcastReceive来启动service
pc端命令:
viewplaincopytoclipboardprint?
Runtime.getRuntime().exec(
"adbshellambroadcast-aNotifyServiceStart");
Runtime.getRuntime().exec(
"adbshellambroadcast-aNotifyServiceStart");
android端的代码:
ServiceBroadcastReceiver.java
viewplaincopytoclipboardprint?
packagecom.otheri.service;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.util.Log;
publicclassServiceBroadcastReceiverextendsBroadcastReceiver{
privatestaticStringSTART_ACTION="NotifyServiceStart";
privatestaticStringSTOP_ACTION="NotifyServiceStop";
@Override
publicvoidonReceive(Contextcontext,Intentintent){
Log.d(androidService.TAG,Thread.currentThread().getName()+"---->"
+"ServiceBroadcastReceiveronReceive");
Stringaction=intent.getAction();
if(START_ACTION.equalsIgnoreCase(action)){
context.startService(newIntent(context,androidService.class));
Log.d(androidService.TAG,Thread.currentThread().getName()+"---->"
+"ServiceBroadcastReceiveronReceivestartend");
}elseif(STOP_ACTION.equalsIgnoreCase(action)){
context.stopService(newIntent(context,androidService.class));
Log.d(androidService.TAG,Thread.currentThread().getName()+"---->"
+"ServiceBroadcastReceiveronReceivestopend");
}
}
}
packagecom.otheri.service;
importandroid.content.BroadcastReceiver;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.util.Log;
publicclassServiceBroadcastReceiverextendsBroadcastReceiver{
privatestaticStringSTART_ACTION="NotifyServiceStart";
privatestaticStringSTOP_ACTION="NotifyServiceStop";
@Override
publicvoidonReceive(Contextcontext,Intentintent){
Log.d(androidService.TAG,Thread.currentThread().getName()+"---->"
+"ServiceBroadcastReceiveronReceive");
Stringaction=intent.getAction();
if(START_ACTION.equalsIgnoreCase(action)){
context.startService(newIntent(context,androidService.class));
Log.d(androidService.TAG,Thread.currentThread().getName()+"---->"
+"ServiceBroadcastReceiveronReceivestartend");
}elseif(STOP_ACTION.equalsIgnoreCase(action)){
context.stopService(newIntent(context,androidService.class));
Log.d(androidService.TAG,Thread.currentThread().getName()+"---->"
+"ServiceBroadcastReceiveronReceivestopend");
}
}
}
5.由于是USB连接,所以socket就可以设计为一但连接就一直联通,即在newsocket和开完out,in流后,就用个while(true){}来循环PC端和android端的读和写
android的代码:
viewplaincopytoclipboardprint?
publicvoidrun(){
Log.d(androidService.TAG,Thread.currentThread().getName()+"---->"
+"aclienthasconnectedtoserver!
");
BufferedOutputStreamout;
BufferedInputStreamin;
try{
/*PC端发来的数据msg*/
StringcurrCMD="";
out=newBufferedOutputStream(client.getOutputStream());
in=newBufferedInputStream(client.getInputStream());
//testSocket();//测试socket方法
androidService.ioThreadFlag=true;
while(androidService.ioThreadFlag){
try{
if(!
client.isConnected()){
break;
}
/*接收PC发来的数据*/
Log.v(androidService.TAG,Thread.currentThread().getName()
+"---->"+"willread......");
/*读操作命令*/
currCMD=readCMDFromSocket(in);
Log.v(androidService.TAG,Thread.currentThread().getName()
+"---->"+"**currCMD===="+currCMD);
/*根据命令分别处理数据*/
if(currCMD.equals("1")){
out.write("OK".getBytes());
out.flush();
}elseif(currCMD.equals("2")){
out.write("OK".getBytes());
out.flush();
}elseif(currCMD.equals("3")){
out.write("OK".getBytes());
out.flush();
}elseif(currCMD.equals("4")){
/*准备接收文件数据*/
try{
out.write("servicereceiveOK".getBytes());
out.flush();
}catch(IOExceptione){
e.printStackTrace();
}
/*接收文件数据,4字节文件长度,4字节文件格式,其后是文件数据*/
byte[]filelength=newbyte[4];
byte[]fileformat=newbyte[4];
byte[]filebytes=null;
/*从socket流中读取完整文件数据*/
filebytes=receiveFileFromSocket(in,out,filelength,
fileformat);
//Log.v(Service139.TAG,"receivedata="+new
//String(filebytes));
try{
/*生成文件*/
Filefile=FileHelper.n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 客户端 Android 服务端 Socket 同步 通信