老式的写法:
ServerSocket srv = new ServerSocket(portNumber)
与时俱进的例子: (那也是相对于2008年了)
ServerSocket srv = new LocalServerSocket("a.b.c");
参数其实随便什么string都行,这总好找吧,而且免除配置了。
至于Socket client什么的,自己照照,写法也是改一句。
不仅仅是名字好决定,而且速度也比port那种快(因为没有走tcpip那套,直接就是共享内从倒腾一下)。
剩下来还有一点,如何从PC那边通过port forward连接到Android里的这个LocalServerSocket呢,adb forward命令支持吗?
adb forward支持的, run:
adb forward tcp: 8000 localabstract: a.b.c
顺便,如果是Linux/Unix/Mac系统,那么本地也可以使用类似的socket,
例如
adb forward localfilesystem:/tmp/ a.b.c localabstract: a.b.c
那么本地就会出现一个文件/tmp/a.b.c, socket就是基于这个名字通过共享内存来高效通信。至于如何连上本地这个socket,那看情况了,Java,socat,nc, python等工具都支持。
还有一点有点扯远了,就是连这个port forward都不要预先建立了,直接通过5037端口连上Android里面的socket。据我的经验这样速度居然提高不少(很久前做的实验,也可能有其他因素,结论不严格)。大致的方法有感兴趣的以后再贴。别的地方都有介绍,例如nodejs实现的adbkit,一大堆。说大白话就是两步:
1. 向localhost:5037 发送host:transport: ANDROID_DEVICE_SERIAL_NUMBER 得到回答,如果是OKAY四个字那就到step2,否则就错误。
2. 继续向上述port发送localabstract:a.b.c
得到回答,如果是OKAY四个字那就到step2,否则就错误。
然后这个链接一直保持着,用来和Android那边直接通信。
只有一点需要注意,由于Android里面的adbd设计的比较傻,两步的内容不能一起发送过去!,一定要等到第一步的OKAY以后才发第二部,不然他内部还没有把通路切换到目标socket那边。
最后提一句,在C里当然一样可以使用这个功能,其实这就是Unix Domain Socket的一种Linux下的进化。
转自 自己的http://osexp2003.blogspot.jp/