pc作为客户端与android服务端使用socket通信_第1页
pc作为客户端与android服务端使用socket通信_第2页
pc作为客户端与android服务端使用socket通信_第3页
pc作为客户端与android服务端使用socket通信_第4页
pc作为客户端与android服务端使用socket通信_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2011-06-22 20:35 PC 客户端与 Android 服务端的 Socket 同步通信(USB)(1) 转载:/wufenglong/archive/2010/07/31/5778862.aspx PC 客户端与 Android 服务端的 Socket 同步通信( USB) 收藏 需求: 1.一个 android 端的 service 后台运行的程序,作为 socket 的服务器端;用于接收 Pc client 端发来的命令,来处理数据后,把结果发给 PC client 2.PC 端程序,作为 socket 的客户端,用于给 android 手机端发操作命令 难点分析: 1.手机一定要有 adb 模式,即插上 USB 线时马上提示的对话框选 adb。好多对 手机的操作都可以用 adb 直接作。 不过,我发现 LG GW880 就没有,要去下载个 2.android 默认手机端的 IP 为“” 3.要想联通 PC 与 android 手机的 sokcet,一定要用 adb forward 来作下端口转发 才能连上 socket. 1. Runtime.getRuntime().exec(“adb forward tcp:12580 tcp:10086“); 2. Thread.sleep(3000); android 端接收数据的代码: 1. /* 2. * 功能:从 socket 流中读取完整文件数据 3. * 4. * InputStream in:socket 输入流 5. * 6. * byte filelength: 流的前 4 个字节存储要转送的文件的字节数 7. * 8. * byte fileformat:流的前 5-8 字节存储要转送的文件的格式(如.apk) 9. * 10. * */ 11. public static byte receiveFileFromSocket(InputStream in, 12. OutputStream out, byte filelength, byte fileformat) 13. byte filebytes = null;/ 文件数据 14. try 15. int filelen = MyUtil.bytesToInt(filelength);/ 文件长度从 4 字节 byte转 成 Int 16. String strtmp = “read file length ok:“ + filelen; 17. out.write(strtmp.getBytes(“utf-8“); 18. out.flush(); 19. 20. filebytes = new bytefilelen; 21. int pos = 0; 22. int rcvLen = 0; 23. while (rcvLen = in.read(filebytes, pos, filelen - pos) 0) 24. pos += rcvLen; 25. 26. Log.v(androidService.TAG, Thread.currentThread().getName() 27. + “-“ + “read file OK:file size=“ + filebytes.length); 28. out.write(“read file ok“.getBytes(“utf-8“); 29. out.flush(); 30. catch (Exception e) 31. Log.v(androidService.TAG, Thread.currentThread().getName() 32. + “-“ + “receiveFileFromSocket error“); 33. e.printStackTrace(); 34. 35. return filebytes; 36. 8.socket 的最重要的机制就是读写采用的是阻塞的方式,如果客户端作为命令发起 者,服务器端作为接收者的话,只有当客户端 client 用 out.writer()写到输出流里后, 即流中有数据 service 的 read 才会执行,不然就会一直停在 read()那里等数据。 9.还要让服务器端可以同时连接多个 client,即服务器端用 new thread()来作数据读 取操作。 源码: 客户端(pc 端): testPcClient.java 1. import java.io.BufferedInputStream; 2. import java.io.BufferedOutputStream; 3. import java.io.BufferedReader; 4. import java.io.ByteArrayOutputStream; 5. import java.io.IOException; 6. import java.io.InputStream; 7. import java.io.InputStreamReader; 8. import .InetAddress; 9. import .Socket; 10. import .UnknownHostException; 11. 12. public class testPcClient 13. 14. /* 15. * param args 16. * throws InterruptedException 17. */ 18. public static void main(String args) throws InterruptedException 19. try 20. Runtime.getRuntime().exec( 21. “adb shell am broadcast -a NotifyServiceStop“); 22. Thread.sleep(3000); 23. Runtime.getRuntime().exec(“adb forward tcp:12580 tcp:10086“); 24. Thread.sleep(3000); 25. Runtime.getRuntime().exec( 26. “adb shell am broadcast -a NotifyServiceStart“); 27. Thread.sleep(3000); 28. catch (IOException e3) 29. e3.printStackTrace(); 30. 31. 32. Socket socket = null; 33. try 34. InetAddress serverAddr = null; 35. serverAddr = InetAddress.getByName(““); 36. System.out.println(“TCP 1111“ + “C: Connecting.“); 37. socket = new Socket(serverAddr, 12580); 38. String str = “hi,wufenglong“; 39. System.out.println(“TCP 221122“ + “C:RECEIVE“); 40. BufferedOutputStream out = new BufferedOutputStream(socket 41. .getOutputStream(); 42. BufferedInputStream in = new BufferedInputStream(socket 43. .getInputStream(); 44. BufferedReader br = new BufferedReader(new InputStreamReader( 45. System.in); 46. boolean flag = true; 47. while (flag) 48. System.out.print(“请输入 16 的数字,退出输入 exit:“); 49. String strWord = br.readLine();/ 从控制台输入 16 50. if (strWord.equals(“1“) 51. out.write(“1“.getBytes(); 52. out.flush(); 53. System.out.println(“1 finish sending the data“); 54. String strFormsocket = readFromSocket(in); 55. System.out.println(“the data sent by server is:rn“ 56. + strFormsocket); 57. System.out 58. .println(“= =“); 59. else if (strWord.equals(“2“) 60. out.write(“2“.getBytes(); 61. out.flush(); 62. System.out.println(“2 finish sending the data“); 63. String strFormsocket = readFromSocket(in); 64. System.out.println(“the data sent by server is:rn“ 65. + strFormsocket); 66. System.out 67. .println(“= =“); 68. else if (strWord.equals(“3“) 69. out.write(“3“.getBytes(); 70. out.flush(); 71. System.out.println(“3 finish sending the data“); 72. String strFormsocket = readFromSocket(in); 73. System.out.println(“the data sent by server is:rn“ 74. + strFormsocket); 75. System.out 76. .println(“= =“); 77. else if (strWord.equals(“4“) 78. /* 发送命令 */ 79. out.write(“4“.getBytes(); 80. out.flush(); 81. System.out.println(“send file finish sending the CMD:“); 82. /* 服务器反馈:准备接收 */ 83. String strFormsocket = readFromSocket(in); 84. System.out 85. .println(“service ready receice data:UPDATE_CONTACTS:“ 86. + strFormsocket); 87. byte filebytes = FileHelper.readFile(“R0013340.JPG“); 88. System.out.println(“file size=“ + filebytes.length); 89. /* 将整数转成 4 字节 byte 数组 */ 90. byte filelength = new byte4; 91. filelength = ToByte(filebytes.length); 92. /* 将.apk 字符串转成 4 字节 byte 数组 */ 93. byte fileformat = null; 94. fileformat = “.apk“.getBytes(); 95. System.out 96. .println(“fileformat length=“ + fileformat.length); 97. /* 字节流中前 4 字节为文件长度, 4 字节文件格式,以后是文件 流 */ 98. /* 注意如果 write 里的 byte超过 socket 的缓存,系统自动分包 写过去,所以对方要循环写完 */ 99. out.write(filelength); 100. out.flush(); 101. String strok1 = readFromSocket(in); 102. System.out.println(“service receive filelength :“ + strok1); 103. / out.write(fileformat); 104. / out.flush(); 105. / String strok2 = readFromSocket(in); 106. / System.out.println(“service receive fileformat :“ + 107. / strok2); 108. System.out.println(“write data to android“); 109. out.write(filebytes); 110. out.flush(); 111. System.out.println(“*“); 112. 113. /* 服务器反馈:接收成功 */ 114. String strread = readFromSocket(in); 115. System.out.println(“ send data success:“ + strread); 116. System.out 117. .println(“= =“); 118. else if (strWord.equalsIgnoreCase(“EXIT“) 119. out.write(“EXIT“.getBytes(); 120. out.flush(); 121. System.out.println(“EXIT finish sending the data“); 122. String strFormsocket = readFromSocket(in); 123. System.out.println(“the data sent by server is:rn“ 124. + strFormsocket); 125. flag = false; 126. System.out 127. .println(“= =“); 128. 129. 130. 131. catch (UnknownHostException e1) 132. System.out.println(“TCP 331133“ + “ERROR:“ + e1.toString(); 133. catch (Exception e2) 134. System.out.println(“TCP 441144“ + “ERROR:“ + e2.toString(); 135. finally 136. try 137. if (socket != null) 138. socket.close(); 139. System.out.println(“socket.close()“); 140. 141. catch (IOException e) 142. System.out.println(“TCP 5555“ + “ERROR:“ + e.toString(); 143. 144. 145. 1. /* 从 InputStream 流中读数据 */ 2. public static String readFromSocket(InputStream in) 3. int MAX_BUFFER_BYTES = 4000; 4. String msg = “; 5. byte tempbuffer = new byteMAX_BUFFER_BYTES; 6. try 7. int numReadedBytes = in.read(tempbuffer, 0, tempbuffer.length); 8. msg = new String(tempbuffer, 0, numReadedBytes, “utf-8“); 9. 10. tempbuffer = null; 11. catch (Exception e) 12. e.printStackTrace(); 13. 14. / Log.v(Service139.TAG, “msg=“ + msg); 15. return msg; 16. 17. android 服务器端: 主类 androidService.java 1. package com.otheri.service; 2. 3. import java.io.File; 4. import java.io.IOException; 5. import .ServerSocket; 6. import .Socket; 7. 8. import android.app.Service; 9. import android.content.BroadcastReceiver; 10. import android.content.Context; 11. import android.content.Intent; 12. import android.content.IntentFilter; 13. import android.os.IBinder; 14. import android.util.Log; 15. 16. /* 17. * 设置:android 手机 18. * 19. * 20. * */ 21. public class androidService extends Service 22. public static final String TAG = “TAG“; 23. public static Boolean mainThreadFlag = true; 24. public static Boolean ioThreadFlag = true; 25. ServerSocket serverSocket = null; 26. final int SERVER_PORT = 10086; 27. File testFile; 28. private sysBroadcastReceiver sysBR; 29. 30. Override 31. public void onCreate() 32. super.onCreate(); 33. Log.v(TAG, Thread.currentThread().getName() + “-“ + “ onCreate“); 34. /* 创建内部类 sysBroadcastReceiver 并注册 registerReceiver */ 35. sysRegisterReceiver(); 36. new Thread() 37. public void run() 38. doListen(); 39. ; 40. .start(); 41. 42. 43. private void doListen() 44. Log.d(TAG, Thread.currentThread().getName() + “-“ 45. + “ doListen() START“); 46. serverSocket = null; 47. try 48. Log.d(TAG, Thread.currentThread().getName() + “-“ 49. + “ doListen() new serverSocket“); 50. serverSocket = new ServerSocket(SERVER_PORT); 51. 52. boolean mainThreadFlag = true; 53. while (mainThreadFlag) 54. Log.d(TAG, Thread.currentThread().getName() + “-“ 55. + “ doListen() listen“); 56. 57. Socket client = serverSocket.accept(); 58. 59. new Thread(new ThreadReadWriterIOSocket(this, client).start(); 60. 61. catch (IOException e1) 62. Log.v(androidService.TAG, Thread.currentThread().getName() 63. + “-“ + “new serverSocket error“); 64. e1.printStackTrace(); 65. 66. 67. 68. /* 创建内部类 sysBroadcastReceiver 并注册 registerReceiver */ 69. private void sysRegisterReceiver() 70. Log.v(TAG, Thread.currentThread().getName() + “-“ 71. + “sysRegisterReceiver“); 72. sysBR = new sysBroadcastReceiver(); 73. /* 注册 BroadcastReceiver */ 74. IntentFilter filter1 = new IntentFilter(); 75. /* 新的应用程序被安装到了设备上的广播 */ 76. filter1.addAction(“ent.action.PACKAGE_ADDED“); 77. filter1.addDataScheme(“package“); 78. filter1.addAction(“ent.action.PACKAGE_REMOVED“); 79. filter1.addDataScheme(“package“); 80. registerReceiver(sysBR, filter1); 81. 82. 83. /* 内部类:BroadcastReceiver 用于接收系统事件 */ 84. private class sysBroadcastReceiver extends BroadcastReceiver 85. 86. Override 87. public void onReceive(Context context, Intent intent) 88. String action = intent.getAction(); 89. if (action.equalsIgnoreCase(“ent.action.PACKAGE_ADDED“) 90. / ReadInstalledAPP(); 91. else if (action 92. .equalsIgnoreCase(“ent.action.PACKAGE_REMOVED“) 93. / ReadInstalledAPP(); 94. 95. Log.v(TAG, Thread.currentThread().getName() + “-“ 96. + “sysBroadcastReceiver onReceive“); 97. 98. 99. 100. Override 101. public void onDestroy() 102. super.onDestroy(); 103. 104. / 关闭线程 105. mainThreadFlag = false; 106. ioThreadFlag = false; 107. / 关闭服务器 108. try 109. Log.v(TAG, Thread.currentThread().getName() + “-“ 110. + “serverSocket.close()“); 111. serverSocket.close(); 112. catch (IOException e) 113. e.printStackTrace(); 114. 115. Log.v(TAG, Thread.currentThread().getName() + “-“ 116. + “* onDestroy*“); 117. 118. 119. Override 120. public void onStart(Intent intent, int startId) 121. Log.d(TAG, Thread.currentThread().getName() + “- “ + “ onStart()“); 122. super.onStart(intent, startId); 123. 124. 125. 126. Override 127. public IBinder onBind(Intent arg0) 128. Log.d(TAG, “ onBind“); 129. return null; 130. 131. 132. 用于接收 PC 发来的 Broastcast 并启动主类 service 的 ServiceBroadcastReceiver.java 1. package com.otheri.service; 2. 3. import android.content.BroadcastReceiver; 4. import android.content.Context; 5. import android.content.Intent; 6. import android.util.Log; 7. 8. public class ServiceBroadcastReceiver extends BroadcastReceiver 9. private static String START_ACTION = “NotifyServiceStart“; 10. private static String STOP_ACTION = “NotifyServiceStop“; 11. 12. Override 13. public void onReceive(Context context, Intent intent) 14. Log.d(androidService.TAG, Thread.currentThread().getName() + “-“ 15. + “ServiceBroadcastReceiver onReceive“); 16. 17. String action = intent.getAction(); 18. if (START_ACTION.equalsIgnoreCase(action) 19. context.startService(new Intent(context, androidService.class); 20. 21. Log.d(androidService.TAG, Thread.currentThread().getName() + “-“ 22. + “ServiceBroadcastReceiver onReceive start end“); 23. else if (STOP_ACTION.equalsIgnoreCase(action) 24. context.stopService(new Intent(context, androidService.class); 25. Log.d(androidService.TAG, Thread.currentThread().getName() + “-“ 26. + “ServiceBroadcastReceiver onReceive stop end“); 27. 28. 29. 30. 用于新 socket 连接的读写线程类 ThreadReadWriterIOSocket.java 1. package com.otheri.service; 2. 3. import java.io.BufferedInputStream; 4. import java.io.BufferedOutputStream; 5. import java.io.ByteArrayOutputStream; 6. import java.io.File; 7. import java.io.IOException; 8. import java.io.InputStream; 9. import java.io.OutputStream; 10. import .Socket; 11. 12. import android.content.Context; 13. import android.util.Log; 14. 15. import com.otheri.util.FileHelper; 16. import com.otheri.util.MyUtil; 17. 18. /* 19. * 功能:用于 socket 的交互 20. * 21. * author wufenglong 22. * 23. */ 24. public class ThreadReadWriterIOSocket implements Runnable 25. private Socket client; 26. private Context context; 27. 28. ThreadReadWriterIOSocket(Context context, Socket client) 29. 30. this.client = client; 31. this.context = context; 32. 33. 34. Override 35. public void run() 36. Log.d(androidService.TAG, Thread.currentThread().getName() + “-“ 37. + “a client has connected to server!“); 38. BufferedOutputStream out; 39. BufferedInputStream in; 40. try 41. /* PC 端发来的数据 msg */ 42. String currCMD = “; 43. out = new BufferedOutputStream(client.getOutputStream(); 44. in = new BufferedInputStream(client.getInputStream(); 45. / testSocket();/ 测试 socket 方法 46. androidService.ioThreadFlag = true; 47. while (androidService.ioThreadFlag) 48. try 49. if (!client.isConnected() 50. break; 51. 52. 53. /* 接收 PC 发来的数据 */ 54. Log.v(androidService.TAG, Thread.currentThread().getName() 55. + “-“ + “will read“); 56. /* 读操作命令 */ 57. currCMD = readCMDFromSocket(in); 58. Log.v(androidService.TAG, Thread.currentThread().getName() 59. + “-“ + “*currCMD = “ + currCMD); 60. 61. /* 根据命令分别处理数据 */ 62. if (currCMD.equals(“1“) 63. out.write(“OK“.getBytes(); 64. out.flush(); 65. else if (currCMD.equals(“2“) 66. out.write(“OK“.getBytes(); 67. out.flush(); 68. else if (currCMD.equals(“3“) 69. out.write(“OK“.getBytes(); 70. out.flush(); 71. else if (currCMD.equals(“4“) 72. /* 准备接收文件数据 */ 73. try 74. out.write(“service receive OK“.getBytes(); 75. out.flush(); 76. catch (IOException e) 77. e.printStackTrace(); 78. 79. 80. /* 接收文件数据,4 字节文件长度, 4 字节文件格式,其后是 文件数据 */ 81. byte filelength = new byte4; 82. byte fileformat = new byte4; 83. byte filebytes = null; 84. 85. /* 从 socket 流中读取完整文件数据 */ 86. filebytes = receiveFileFromSocket(in, out, filelength, 87. fileformat); 88. 89. / Log.v(Service139.TAG, “receive data =“ + new 90. / String(filebytes); 91. try 9

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论