PC客户端与Android服务端的Socket同步通信(USB)

PC客户端与Android服务端的Socket同步通信(USB) 博客分类: Android
Socket Android thread .net 设计模式

http://blog.csdn.net/wufenglong/category/687662.aspx

需求:

     1.一个android端的service后台运行的程序,作为socket的服务器端;用于接收Pc client端发来的命令,来处理数据后,把结果发给PC client

     2.PC端程序,作为socket的客户端,用于给android手机端发操作命令

难点分析:

     1.手机一定要有adb模式,即插上USB线时马上提示的对话框选adb。好多对手机的操作都可以用adb直接作。

        不过,我发现LG GW880就没有,要去下载个

     2.android默认手机端的IP为“127.0.0.1”

     3.要想联通PC与android手机的sokcet,一定要用adb forward 来作下端口转发才能连上socket.

  1. Runtime.getRuntime().exec("adb forward tcp:12580 tcp:10086"); 
  2.             Thread.sleep(3000); 
Java代码 复制代码
  1. Runtime.getRuntime().exec("adb forward tcp:12580 tcp:10086"); 
  2.             Thread.sleep(3000); 
Runtime.getRuntime().exec("adb forward tcp:12580 tcp:10086"); Thread.sleep(3000);

       4.android端的service程序Install到手机上容易,但是还要有方法来从PC的client端来启动手机上的service ,这个办法可以通过PC端adb命令来发一个Broastcast ,手机端再写个接收BroastcastReceive来接收这个Broastcast,在这个BroastcastReceive来启动service

     

    pc端命令:

 

view plain copy to clipboard print ?
  1. Runtime.getRuntime().exec( 
  2. "adb shell am broadcast -a NotifyServiceStart"); 
Java代码 复制代码
  1. Runtime.getRuntime().exec( 
  2. "adb shell am broadcast -a NotifyServiceStart"); 
Runtime.getRuntime().exec( "adb shell am broadcast -a NotifyServiceStart");

android端的代码:ServiceBroadcastReceiver.java

view plain copy to clipboard print ?
  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.  

Java代码 复制代码
  1. package com.otheri.service; 
  2. import android.content.BroadcastReceiver; 
  3. import android.content.Context; 
  4. import android.content.Intent; 
  5. import android.util.Log; 
  6. public class ServiceBroadcastReceiver extends BroadcastReceiver { 
  7.     private static String START_ACTION = "NotifyServiceStart"
  8.     private static String STOP_ACTION = "NotifyServiceStop"
  9.     @Override 
  10.     public void onReceive(Context context, Intent intent) { 
  11.         Log.d(androidService.TAG, Thread.currentThread().getName() + "---->" 
  12.                 + "ServiceBroadcastReceiver onReceive"); 
  13.         String action = intent.getAction(); 
  14.         if (START_ACTION.equalsIgnoreCase(action)) { 
  15.             context.startService(new Intent(context, androidService.class)); 
  16.             Log.d(androidService.TAG, Thread.currentThread().getName() + "---->" 
  17.                     + "ServiceBroadcastReceiver onReceive start end"); 
  18.         } else if (STOP_ACTION.equalsIgnoreCase(action)) { 
  19.             context.stopService(new Intent(context, androidService.class)); 
  20.             Log.d(androidService.TAG, Thread.currentThread().getName() + "---->" 
  21.                     + "ServiceBroadcastReceiver onReceive stop end"); 
  22.         } 
  23.     } 
package com.otheri.service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class ServiceBroadcastReceiver extends BroadcastReceiver { private static String START_ACTION = "NotifyServiceStart"; private static String STOP_ACTION = "NotifyServiceStop"; @Override public void onReceive(Context context, Intent intent) { Log.d(androidService.TAG, Thread.currentThread().getName() + "---->" + "ServiceBroadcastReceiver onReceive"); String action = intent.getAction(); if (START_ACTION.equalsIgnoreCase(action)) { context.startService(new Intent(context, androidService.class)); Log.d(androidService.TAG, Thread.currentThread().getName() + "---->" + "ServiceBroadcastReceiver onReceive start end"); } else if (STOP_ACTION.equalsIgnoreCase(action)) { context.stopService(new Intent(context, androidService.class)); Log.d(androidService.TAG, Thread.currentThread().getName() + "---->" + "ServiceBroadcastReceiver onReceive stop end"); } } }

  5.由于是USB连接,所以socket就可以设计为一但连接就一直联通,即在new socket和开完out,in流后,就用个while(true){}来循环PC端和android端的读和写

    android的代码:

view plain copy to clipboard print ?
  1. public void run() { 
  2.         Log.d(androidService.TAG, Thread.currentThread().getName() + "---->" 
  3.                 + "a client has connected to server!"); 
  4.         BufferedOutputStream out; 
  5.         BufferedInputStream in; 
  6.         try
  7.             /* PC端发来的数据msg */ 
  8.             String currCMD = ""
  9.             out = new BufferedOutputStream(client.getOutputStream()); 
  10.             in = new BufferedInputStream(client.getInputStream()); 
  11.             // testSocket();// 测试socket方法 
  12.             androidService.ioThreadFlag = true
  13.             while (androidService.ioThreadFlag) { 
  14.                 try
  15.                     if (!client.isConnected()) { 
  16.                         break
  17.                     } 
  18.  
  19.                     /* 接收PC发来的数据 */ 
  20.                     Log.v(androidService.TAG, Thread.currentThread().getName() 
  21.                             + "---->" + "will read......"); 
  22.                     /* 读操作命令 */ 
  23.                     currCMD = readCMDFromSocket(in); 
  24.                     Log.v(androidService.TAG, Thread.currentThread().getName() 
  25.                             + "---->" + "**currCMD ==== " + currCMD); 
  26.  
  27.                     /* 根据命令分别处理数据 */ 
  28.                     if (currCMD.equals("1")) { 
  29.                         out.write("OK".getBytes()); 
  30.                         out.flush(); 
  31.                     } else if (currCMD.equals("2")) { 
  32.                         out.write("OK".getBytes()); 
  33.                         out.flush(); 
  34.                     } else if (currCMD.equals("3")) { 
  35.                         out.write("OK".getBytes()); 
  36.                         out.flush(); 
  37.                     } else if (currCMD.equals("4")) { 
  38.                         /* 准备接收文件数据 */ 
  39.                         try
  40.                             out.write("service receive OK".getBytes()); 
  41.                             out.flush(); 
  42.                         } catch (IOException e) { 
  43.                             e.printStackTrace(); 
  44.                         } 
  45.  
  46.                         /* 接收文件数据,4字节文件长度,4字节文件格式,其后是文件数据 */ 
  47.                         byte[] filelength = new byte[4]; 
  48.                         byte[] fileformat = new byte[4]; 
  49.                         byte[] filebytes = null
  50.  
  51.                         /* 从socket流中读取完整文件数据 */ 
  52.                         filebytes = receiveFileFromSocket(in, out, filelength, 
  53.                                 fileformat); 
  54.  
  55.                         // Log.v(Service139.TAG, "receive data =" + new 
  56.                         // String(filebytes)); 
  57.                         try
  58.                             /* 生成文件 */ 
  59.                             File file = FileHelper.newFile("R0013340.JPG"); 
  60.                             FileHelper.writeFile(file, filebytes, 0
  61.                                     filebytes.length); 
  62.                         } catch (IOException e) { 
  63.                             e.printStackTrace(); 
  64.                         } 
  65.                     } else if (currCMD.equals("exit")) { 
  66.  
  67.                     } 
  68.                 } catch (Exception e) { 
  69.                     // try { 
  70.                     // out.write("error".getBytes("utf-8")); 
  71.                     // out.flush(); 
  72.                     // } catch (IOException e1) { 
  73.                     // e1.printStackTrace(); 
  74.                     // } 
  75.                     Log.e(androidService.TAG, Thread.currentThread().getName() 
  76.                             + "---->" + "read write error111111"); 
  77.                 } 
  78.             } 
  79.             out.close(); 
  80.             in.close(); 
  81.         } catch (Exception e) { 
  82.             Log.e(androidService.TAG, Thread.currentThread().getName() 
  83.                     + "---->" + "read write error222222"); 
  84.             e.printStackTrace(); 
  85.         } finally
  86.             try
  87.                 if (client != null) { 
  88.                     Log.v(androidService.TAG, Thread.currentThread().getName() 
  89.                             + "---->" + "client.close()"); 
  90.                     client.close(); 
  91.                 } 
  92.             } catch (IOException e) { 
  93.                 Log.e(androidService.TAG, Thread.currentThread().getName() 
  94.                         + "---->" + "read write error333333"); 
  95.                 e.printStackTrace(); 
  96.             } 
  97.         } 

Java代码 复制代码
  1. public void run() { 
  2.         Log.d(androidService.TAG, Thread.currentThread().getName() + "---->" 
  3.                 + "a client has connected to server!"); 
  4.         BufferedOutputStream out; 
  5.         BufferedInputStream in; 
  6.         try
  7.             /* PC端发来的数据msg */ 
  8.             String currCMD = ""
  9.             out = new BufferedOutputStream(client.getOutputStream()); 
  10.             in = new BufferedInputStream(client.getInputStream()); 
  11.             // testSocket();// 测试socket方法 
  12.             androidService.ioThreadFlag = true
  13.             while (androidService.ioThreadFlag) { 
  14.                 try
  15.                     if (!client.isConnected()) { 
  16.                         break
  17.                     } 
  18.                     /* 接收PC发来的数据 */ 
  19.                     Log.v(androidService.TAG, Thread.currentThread().getName() 
  20.                             + "---->" + "will read......"); 
  21.                     /* 读操作命令 */ 
  22.                     currCMD = readCMDFromSocket(in); 
  23.                     Log.v(androidService.TAG, Thread.currentThread().getName() 
  24.                             + "---->" + "**currCMD ==== " + currCMD); 
  25.                     /* 根据命令分别处理数据 */ 
  26.                     if (currCMD.equals("1")) { 
  27.                         out.write("OK".getBytes()); 
  28.                         out.flush(); 
  29.                     } else if (currCMD.equals("2")) { 
  30.                         out.write("OK".getBytes()); 
  31.                         out.flush(); 
  32.                     } else if (currCMD.equals("3")) { 
  33.                         out.write("OK".getBytes()); 
  34.                         out.flush(); 
  35.                     } else if (currCMD.equals("4")) { 
  36.                         /* 准备接收文件数据 */ 
  37.                         try
  38.                             out.write("service receive OK".getBytes()); 
  39.                             out.flush(); 
  40.                         } catch (IOException e) { 
  41.                             e.printStackTrace(); 
  42.                         } 
  43.                         /* 接收文件数据,4字节文件长度,4字节文件格式,其后是文件数据 */ 
  44.                         byte[] filelength = new byte[4]; 
  45.                         byte[] fileformat = new byte[4]; 
  46.                         byte[] filebytes = null
  47.                         /* 从socket流中读取完整文件数据 */ 
  48.                         filebytes = receiveFileFromSocket(in, out, filelength, 
  49.                                 fileformat); 
  50.                         // Log.v(Service139.TAG, "receive data =" + new 
  51.                         // String(filebytes)); 
  52.                         try
  53.                             /* 生成文件 */ 
  54.                             File file = FileHelper.newFile("R0013340.JPG"); 
  55.                             FileHelper.writeFile(file, filebytes, 0
  56.                                     filebytes.length); 
  57.                         } catch (IOException e) { 
  58.                             e.printStackTrace(); 
  59.                         } 
  60.                     } else if (currCMD.equals("exit")) { 
  61.                     } 
  62.                 } catch (Exception e) { 
  63.                     // try { 
  64.                     // out.write("error".getBytes("utf-8")); 
  65.                     // out.flush(); 
  66.                     // } catch (IOException e1) { 
  67.                     // e1.printStackTrace(); 
  68.                     // } 
  69.                     Log.e(androidService.TAG, Thread.currentThread().getName() 
  70.                             + "---->" + "read write error111111"); 
  71.                 } 
  72.             } 
  73.             out.close(); 
  74.             in.close(); 
  75.         } catch (Exception e) { 
  76.             Log.e(androidService.TAG, Thread.currentThread().getName() 
  77.                     + "---->" + "read write error222222"); 
  78.             e.printStackTrace(); 
  79.         } finally
  80.             try
  81.                 if (client != null) { 
  82.                     Log.v(androidService.TAG, Thread.currentThread().getName() 
  83.                             + "---->" + "client.close()"); 
  84.                     client.close(); 
  85.                 } 
  86.             } catch (IOException e) { 
  87.                 Log.e(androidService.TAG, Thread.currentThread().getName() 
  88.                         + "---->" + "read write error333333"); 
  89.                 e.printStackTrace(); 
  90.             } 
  91.         } 
public void run() { Log.d(androidService.TAG, Thread.currentThread().getName() + "---->" + "a client has connected to server!"); BufferedOutputStream out; BufferedInputStream in; try { /* PC端发来的数据msg */ String currCMD = ""; out = new BufferedOutputStream(client.getOutputStream()); in = new BufferedInputStream(client.getInputStream()); // testSocket();// 测试socket方法 androidService.ioThreadFlag = true; while (androidService.ioThreadFlag) { try { if (!client.isConnected()) { break; } /* 接收PC发来的数据 */ Log.v(androidService.TAG, Thread.currentThread().getName() + "---->" + "will read......"); /* 读操作命令 */ currCMD = readCMDFromSocket(in); Log.v(androidService.TAG, Thread.currentThread().getName() + "---->" + "**currCMD ==== " + currCMD); /* 根据命令分别处理数据 */ if (currCMD.equals("1")) { out.write("OK".getBytes()); out.flush(); } else if (currCMD.equals("2")) { out.write("OK".getBytes()); out.flush(); } else if (currCMD.equals("3")) { out.write("OK".getBytes()); out.flush(); } else if (currCMD.equals("4")) { /* 准备接收文件数据 */ try { out.write("service receive OK".getBytes()); out.flush(); } catch (IOException e) { e.printStackTrace(); } /* 接收文件数据,4字节文件长度,4字节文件格式,其后是文件数据 */ byte[] filelength = new byte[4]; byte[] fileformat = new byte[4]; byte[] filebytes = null; /* 从socket流中读取完整文件数据 */ filebytes = receiveFileFromSocket(in, out, filelength, fileformat); // Log.v(Service139.TAG, "receive data =" + new // String(filebytes)); try { /* 生成文件 */ File file = FileHelper.newFile("R0013340.JPG"); FileHelper.writeFile(file, filebytes, 0, filebytes.length); } catch (IOException e) { e.printStackTrace(); } } else if (currCMD.equals("exit")) { } } catch (Exception e) { // try { // out.write("error".getBytes("utf-8")); // out.flush(); // } catch (IOException e1) { // e1.printStackTrace(); // } Log.e(androidService.TAG, Thread.currentThread().getName() + "---->" + "read write error111111"); } } out.close(); in.close(); } catch (Exception e) { Log.e(androidService.TAG, Thread.currentThread().getName() + "---->" + "read write error222222"); e.printStackTrace(); } finally { try { if (client != null) { Log.v(androidService.TAG, Thread.currentThread().getName() + "---->" + "client.close()"); client.close(); } } catch (IOException e) { Log.e(androidService.TAG, Thread.currentThread().getName() + "---->" + "read write error333333"); e.printStackTrace(); } }

  6.如果是在PC端和android端的读写操作来while(true){}循环,这样socket流的结尾不好判断,不能用“-1”来判断,因为“-1”是只有在socket关闭时才作为判断结尾。

  7.socket在out.write(bytes);时,要是数据太大时,超过socket的缓存,socket自动分包发送,所以对方就一定要用循环 来多次读。最好的办法就是服务器和客户端协议好,比如发文件时,先写过来一个要发送的文件的大小,然后再发送文件;对方用这个大小,来循环读取数据。

   android端接收数据的代码:

view plain copy to clipboard print ?
  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 byte[filelen]; 
  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.     } 

Java代码 复制代码
  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.             filebytes = new byte[filelen]; 
  20.             int pos = 0
  21.             int rcvLen = 0
  22.             while ((rcvLen = in.read(filebytes, pos, filelen - pos)) > 0) { 
  23.                 pos += rcvLen; 
  24.             } 
  25.             Log.v(androidService.TAG, Thread.currentThread().getName() 
  26.                     + "---->" + "read file OK:file size=" + filebytes.length); 
  27.             out.write("read file ok".getBytes("utf-8")); 
  28.             out.flush(); 
  29.         } catch (Exception e) { 
  30.             Log.v(androidService.TAG, Thread.currentThread().getName() 
  31.                     + "---->" + "receiveFileFromSocket error"); 
  32.             e.printStackTrace(); 
  33.         } 
  34.         return filebytes; 
  35.     } 
/** * 功能:从socket流中读取完整文件数据 * * InputStream in:socket输入流 * * byte[] filelength: 流的前4个字节存储要转送的文件的字节数 * * byte[] fileformat:流的前5-8字节存储要转送的文件的格式(如.apk) * * */ public static byte[] receiveFileFromSocket(InputStream in, OutputStream out, byte[] filelength, byte[] fileformat) { byte[] filebytes = null;// 文件数据 try { int filelen = MyUtil.bytesToInt(filelength);// 文件长度从4字节byte[]转成Int String strtmp = "read file length ok:" + filelen; out.write(strtmp.getBytes("utf-8")); out.flush(); filebytes = new byte[filelen]; int pos = 0; int rcvLen = 0; while ((rcvLen = in.read(filebytes, pos, filelen - pos)) > 0) { pos += rcvLen; } Log.v(androidService.TAG, Thread.currentThread().getName() + "---->" + "read file OK:file size=" + filebytes.length); out.write("read file ok".getBytes("utf-8")); out.flush(); } catch (Exception e) { Log.v(androidService.TAG, Thread.currentThread().getName() + "---->" + "receiveFileFromSocket error"); e.printStackTrace(); } return filebytes; }

8.socket的最重要的机制就是读写采用的是阻塞的方式,如果客户端作为命令发起者,服务器端作为接收者的话,只有当客户端client用out.writer()写到输出流里后,即流中有数据service的read才会执行,不然就会一直停在read()那里等数据。

9.还要让服务器端可以同时连接多个client,即服务器端用new thread()来作数据读取操作。

源码:

客户端(pc端):

testPcClient.java

view plain copy to clipboard print ?
  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 java.net.InetAddress; 
  9. import java.net.Socket; 
  10. import java.net.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("127.0.0.1"); 
  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("请输入1~6的数字,退出输入exit:"); 
  49.                 String strWord = br.readLine();// 从控制台输入1~6 
  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:\r\n" 
  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:\r\n" 
  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:\r\n" 
  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 byte[4]; 
  91.                     filelength = tools.intToByte(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:\r\n" 
  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.     } 
  146.  
  147.     /* 从InputStream流中读数据 */ 
  148.     public static String readFromSocket(InputStream in) { 
  149.         int MAX_BUFFER_BYTES = 4000
  150.         String msg = ""
  151.         byte[] tempbuffer = new byte[MAX_BUFFER_BYTES]; 
  152.         try
  153.             int numReadedBytes = in.read(tempbuffer, 0, tempbuffer.length); 
  154.             msg = new String(tempbuffer, 0, numReadedBytes, "utf-8"); 
  155.  
  156.             tempbuffer = null
  157.         } catch (Exception e) { 
  158.             e.printStackTrace(); 
  159.         } 
  160.         // Log.v(Service139.TAG, "msg=" + msg); 
  161.         return msg; 
  162.     } 

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 java.net.InetAddress; 
  9. import java.net.Socket; 
  10. import java.net.UnknownHostException; 
  11. public class testPcClient { 
  12.     /**
  13.      * @param args
  14.      * @throws InterruptedException
  15.      */ 
  16.     public static void main(String[] args) throws InterruptedException { 
  17.         try
  18.             Runtime.getRuntime().exec( 
  19.                     "adb shell am broadcast -a NotifyServiceStop"); 
  20.             Thread.sleep(3000); 
  21.             Runtime.getRuntime().exec("adb forward tcp:12580 tcp:10086"); 
  22.             Thread.sleep(3000); 
  23.             Runtime.getRuntime().exec( 
  24.                     "adb shell am broadcast -a NotifyServiceStart"); 
  25.             Thread.sleep(3000); 
  26.         } catch (IOException e3) { 
  27.             e3.printStackTrace(); 
  28.         } 
  29.         Socket socket = null
  30.         try
  31.             InetAddress serverAddr = null
  32.             serverAddr = InetAddress.getByName("127.0.0.1"); 
  33.             System.out.println("TCP 1111" + "C: Connecting..."); 
  34.             socket = new Socket(serverAddr, 12580); 
  35.             String str = "hi,wufenglong"
  36.             System.out.println("TCP 221122" + "C:RECEIVE"); 
  37.             BufferedOutputStream out = new BufferedOutputStream(socket 
  38.                     .getOutputStream()); 
  39.             BufferedInputStream in = new BufferedInputStream(socket 
  40.                     .getInputStream()); 
  41.             BufferedReader br = new BufferedReader(new InputStreamReader( 
  42.                     System.in)); 
  43.             boolean flag = true
  44.             while (flag) { 
  45.                 System.out.print("请输入1~6的数字,退出输入exit:"); 
  46.                 String strWord = br.readLine();// 从控制台输入1~6 
  47.                 if (strWord.equals("1")) { 
  48.                     out.write("1".getBytes()); 
  49.                     out.flush(); 
  50.                     System.out.println("1 finish sending the data"); 
  51.                     String strFormsocket = readFromSocket(in); 
  52.                     System.out.println("the data sent by server is:\r\n" 
  53.                             + strFormsocket); 
  54.                     System.out 
  55.                             .println("============================================="); 
  56.                 } else if (strWord.equals("2")) { 
  57.                     out.write("2".getBytes()); 
  58.                     out.flush(); 
  59.                     System.out.println("2 finish sending the data"); 
  60.                     String strFormsocket = readFromSocket(in); 
  61.                     System.out.println("the data sent by server is:\r\n" 
  62.                             + strFormsocket); 
  63.                     System.out 
  64.                             .println("============================================="); 
  65.                 } else if (strWord.equals("3")) { 
  66.                     out.write("3".getBytes()); 
  67.                     out.flush(); 
  68.                     System.out.println("3 finish sending the data"); 
  69.                     String strFormsocket = readFromSocket(in); 
  70.                     System.out.println("the data sent by server is:\r\n" 
  71.                             + strFormsocket); 
  72.                     System.out 
  73.                             .println("============================================="); 
  74.                 } else if (strWord.equals("4")) { 
  75.                     /* 发送命令 */ 
  76.                     out.write("4".getBytes()); 
  77.                     out.flush(); 
  78.                     System.out.println("send file finish sending the CMD:"); 
  79.                     /* 服务器反馈:准备接收 */ 
  80.                     String strFormsocket = readFromSocket(in); 
  81.                     System.out 
  82.                             .println("service ready receice data:UPDATE_CONTACTS:" 
  83.                                     + strFormsocket); 
  84.                     byte[] filebytes = FileHelper.readFile("R0013340.JPG"); 
  85.                     System.out.println("file size=" + filebytes.length); 
  86.                     /* 将整数转成4字节byte数组 */ 
  87.                     byte[] filelength = new byte[4]; 
  88.                     filelength = tools.intToByte(filebytes.length); 
  89.                     /* 将.apk字符串转成4字节byte数组 */ 
  90.                     byte[] fileformat = null
  91.                     fileformat = ".apk".getBytes(); 
  92.                     System.out 
  93.                             .println("fileformat length=" + fileformat.length); 
  94.                     /* 字节流中前4字节为文件长度,4字节文件格式,以后是文件流 */ 
  95.                     /* 注意如果write里的byte[]超过socket的缓存,系统自动分包写过去,所以对方要循环写完 */ 
  96.                     out.write(filelength); 
  97.                     out.flush(); 
  98.                     String strok1 = readFromSocket(in); 
  99.                     System.out.println("service receive filelength :" + strok1); 
  100.                     // out.write(fileformat); 
  101.                     // out.flush(); 
  102.                     // String strok2 = readFromSocket(in); 
  103.                     // System.out.println("service receive fileformat :" + 
  104.                     // strok2); 
  105.                     System.out.println("write data to android"); 
  106.                     out.write(filebytes); 
  107.                     out.flush(); 
  108.                     System.out.println("*********"); 
  109.                     /* 服务器反馈:接收成功 */ 
  110.                     String strread = readFromSocket(in); 
  111.                     System.out.println(" send data success:" + strread); 
  112.                     System.out 
  113.                             .println("============================================="); 
  114.                 } else if (strWord.equalsIgnoreCase("EXIT")) { 
  115.                     out.write("EXIT".getBytes()); 
  116.                     out.flush(); 
  117.                     System.out.println("EXIT finish sending the data"); 
  118.                     String strFormsocket = readFromSocket(in); 
  119.                     System.out.println("the data sent by server is:\r\n" 
  120.                             + strFormsocket); 
  121.                     flag = false
  122.                     System.out 
  123.                             .println("============================================="); 
  124.                 } 
  125.             } 
  126.         } catch (UnknownHostException e1) { 
  127.             System.out.println("TCP 331133" + "ERROR:" + e1.toString()); 
  128.         } catch (Exception e2) { 
  129.             System.out.println("TCP 441144" + "ERROR:" + e2.toString()); 
  130.         } finally
  131.             try
  132.                 if (socket != null) { 
  133.                     socket.close(); 
  134.                     System.out.println("socket.close()"); 
  135.                 } 
  136.             } catch (IOException e) { 
  137.                 System.out.println("TCP 5555" + "ERROR:" + e.toString()); 
  138.             } 
  139.         } 
  140.     } 
  141.     /* 从InputStream流中读数据 */ 
  142.     public static String readFromSocket(InputStream in) { 
  143.         int MAX_BUFFER_BYTES = 4000
  144.         String msg = ""
  145.         byte[] tempbuffer = new byte[MAX_BUFFER_BYTES]; 
  146.         try
  147.             int numReadedBytes = in.read(tempbuffer, 0, tempbuffer.length); 
  148.             msg = new String(tempbuffer, 0, numReadedBytes, "utf-8"); 
  149.             tempbuffer = null
  150.         } catch (Exception e) { 
  151.             e.printStackTrace(); 
  152.         } 
  153.         // Log.v(Service139.TAG, "msg=" + msg); 
  154.         return msg; 
  155.     } 
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class testPcClient { /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { try { Runtime.getRuntime().exec( "adb shell am broadcast -a NotifyServiceStop"); Thread.sleep(3000); Runtime.getRuntime().exec("adb forward tcp:12580 tcp:10086"); Thread.sleep(3000); Runtime.getRuntime().exec( "adb shell am broadcast -a NotifyServiceStart"); Thread.sleep(3000); } catch (IOException e3) { e3.printStackTrace(); } Socket socket = null; try { InetAddress serverAddr = null; serverAddr = InetAddress.getByName("127.0.0.1"); System.out.println("TCP 1111" + "C: Connecting..."); socket = new Socket(serverAddr, 12580); String str = "hi,wufenglong"; System.out.println("TCP 221122" + "C:RECEIVE"); BufferedOutputStream out = new BufferedOutputStream(socket .getOutputStream()); BufferedInputStream in = new BufferedInputStream(socket .getInputStream()); BufferedReader br = new BufferedReader(new InputStreamReader( System.in)); boolean flag = true; while (flag) { System.out.print("请输入1~6的数字,退出输入exit:"); String strWord = br.readLine();// 从控制台输入1~6 if (strWord.equals("1")) { out.write("1".getBytes()); out.flush(); System.out.println("1 finish sending the data"); String strFormsocket = readFromSocket(in); System.out.println("the data sent by server is:\r\n" + strFormsocket); System.out .println("============================================="); } else if (strWord.equals("2")) { out.write("2".getBytes()); out.flush(); System.out.println("2 finish sending the data"); String strFormsocket = readFromSocket(in); System.out.println("the data sent by server is:\r\n" + strFormsocket); System.out .println("============================================="); } else if (strWord.equals("3")) { out.write("3".getBytes()); out.flush(); System.out.println("3 finish sending the data"); String strFormsocket = readFromSocket(in); System.out.println("the data sent by server is:\r\n" + strFormsocket); System.out .println("============================================="); } else if (strWord.equals("4")) { /* 发送命令 */ out.write("4".getBytes()); out.flush(); System.out.println("send file finish sending the CMD:"); /* 服务器反馈:准备接收 */ String strFormsocket = readFromSocket(in); System.out .println("service ready receice data:UPDATE_CONTACTS:" + strFormsocket); byte[] filebytes = FileHelper.readFile("R0013340.JPG"); System.out.println("file size=" + filebytes.length); /* 将整数转成4字节byte数组 */ byte[] filelength = new byte[4]; filelength = tools.intToByte(filebytes.length); /* 将.apk字符串转成4字节byte数组 */ byte[] fileformat = null; fileformat = ".apk".getBytes(); System.out .println("fileformat length=" + fileformat.length); /* 字节流中前4字节为文件长度,4字节文件格式,以后是文件流 */ /* 注意如果write里的byte[]超过socket的缓存,系统自动分包写过去,所以对方要循环写完 */ out.write(filelength); out.flush(); String strok1 = readFromSocket(in); System.out.println("service receive filelength :" + strok1); // out.write(fileformat); // out.flush(); // String strok2 = readFromSocket(in); // System.out.println("service receive fileformat :" + // strok2); System.out.println("write data to android"); out.write(filebytes); out.flush(); System.out.println("*********"); /* 服务器反馈:接收成功 */ String strread = readFromSocket(in); System.out.println(" send data success:" + strread); System.out .println("============================================="); } else if (strWord.equalsIgnoreCase("EXIT")) { out.write("EXIT".getBytes()); out.flush(); System.out.println("EXIT finish sending the data"); String strFormsocket = readFromSocket(in); System.out.println("the data sent by server is:\r\n" + strFormsocket); flag = false; System.out .println("============================================="); } } } catch (UnknownHostException e1) { System.out.println("TCP 331133" + "ERROR:" + e1.toString()); } catch (Exception e2) { System.out.println("TCP 441144" + "ERROR:" + e2.toString()); } finally { try { if (socket != null) { socket.close(); System.out.println("socket.close()"); } } catch (IOException e) { System.out.println("TCP 5555" + "ERROR:" + e.toString()); } } } /* 从InputStream流中读数据 */ public static String readFromSocket(InputStream in) { int MAX_BUFFER_BYTES = 4000; String msg = ""; byte[] tempbuffer = new byte[MAX_BUFFER_BYTES]; try { int numReadedBytes = in.read(tempbuffer, 0, tempbuffer.length); msg = new String(tempbuffer, 0, numReadedBytes, "utf-8"); tempbuffer = null; } catch (Exception e) { e.printStackTrace(); } // Log.v(Service139.TAG, "msg=" + msg); return msg; } }

android服务器端:

主类androidService.java

view plain copy to clipboard print ?
  1. package com.otheri.service; 
  2.  
  3. import java.io.File; 

你可能感兴趣的:(Android)