先看看java doc:

Open Declaration void xxx.yyy.ddmlib.IDevice.createForward(int localPort, int remotePort) throws TimeoutException, AdbCommandRejectedException, IOException

 

Creates a port forwarding between a local and a remote port.

Parameters:
localPort the local port to forward
remotePort the remote port.
Returns:
true if success.
Throws:
TimeoutException - in case of timeout on the connection.
AdbCommandRejectedException - if adb rejects the command
IOException - in case of I/O error on the connection.

    如果不能很好的理解这个函数的参数的含义,就无法写出pc与android手机进行通讯的程序。
    android自身跑monkey的代码,其实已经说明白了此api的用法。这里,我以更加直白的方式重新阐述一遍。
    假设,我们有一部android手机,在手机上写了一个程序(可能是C++,也可能是用Java写的),这个程序起了TCP的服务端,假设端口是5678,它能够接受来自TCP客户端的连接。由于手机与pc的连接一般是通过usb或者是以无线adb连接的方式进行互连。ddmlib为了屏蔽具体连接细节上的差异,统一使用createForward,使得pc与手机侧程序的通信,就如同pc上两个程序的tcp通讯一样简单。具体做法是:通过调用createForward,在pc侧也启动一个peer(对等)的tcp服务端,端口号就是上面函数参数的localPort。
    比如createForward(1234, 5678),这个时候,ddmlib会在幕后建立pc上的tcp服务端,端口是1234;并且在手机上建立一个tcp客户端(端口号由ddmlib指定,这里记为端口号是xxxx),并且与android手机上的tcp服务端(端口是5678)建立tcp连接。借助手机上新建立的tcp客户端,ddmlib在pc和android手机之间建立了“透明”的消息转发通道。这个就是createForward的大致原理,具体实现细节,没有去深究,有兴趣的同学可以去深挖android的源码,探究其原理。
    在pc侧,如果你想要与android上的tcp服务(端口是5678)通讯。你只要建立一个tcp客户端去连接本机上的tcp服务(端口是1234),建立连接后,给1234端口发消息,或者从1234端口收消息,其效果就是给android手机上的5678发消息,或者从5678收消息。
    大致方法:
  1. try {  
  2.             Socket server = new Socket("127.0.0.1"1234);  
  3.             in = new DataInputStream(new BufferedInputStream(  
  4.                     server.getInputStream(), 1024));  
  5.             out = new PrintWriter(server.getOutputStream());  
  6.         } catch (Exception e) {  
  7.             throw e;  
  8.         }   
如果你想收字符串,那么流就不要使用DataInputStream了,而是像monkey客户端这样:
  1. public void openMonkeyConnection() { 
  2.         try { 
  3.             InetAddress addr = InetAddress.getByName(monkeyServer); 
  4.             monkeySocket = new Socket(addr, monkeyPort); 
  5.             monkeyWriter = new BufferedWriter(new OutputStreamWriter( 
  6.                     monkeySocket.getOutputStream())); 
  7.             monkeyReader = new BufferedReader(new InputStreamReader( 
  8.                     monkeySocket.getInputStream())); 
  9.         } catch (UnknownHostException e) { 
  10.             e.printStackTrace(); 
  11.         } catch (IOException e) { 
  12.             e.printStackTrace(); 
  13.         } 
  14.     }