先看看java doc:
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收消息。
- 大致方法:
- try {
- Socket server = new Socket("127.0.0.1", 1234);
- in = new DataInputStream(new BufferedInputStream(
- server.getInputStream(), 1024));
- out = new PrintWriter(server.getOutputStream());
- } catch (Exception e) {
- throw e;
- }
- 如果你想收字符串,那么流就不要使用DataInputStream了,而是像monkey客户端这样:
- public void openMonkeyConnection() {
- try {
- InetAddress addr = InetAddress.getByName(monkeyServer);
- monkeySocket = new Socket(addr, monkeyPort);
- monkeyWriter = new BufferedWriter(new OutputStreamWriter(
- monkeySocket.getOutputStream()));
- monkeyReader = new BufferedReader(new InputStreamReader(
- monkeySocket.getInputStream()));
- } catch (UnknownHostException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }