您的位置:首页 > 移动开发 > Android开发

不要在为唯一的port号烦恼了

2015-05-27 00:00 302 查看
摘要: 好多项目里,在Android的App里做个socket server让外面用,port选多少呢? 往往会固定一个自以为没人用的,或者允许配置。
多少年了,还这么不严格,不能更简单点吗?
可以了,因为Android里一直是支持Abstract Socket Name的,就是用任意的string来代替port

老式的写法:

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息