不要在为唯一的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/
多少年了,还这么不严格,不能更简单点吗?
可以了,因为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/
相关文章推荐
- 读易[20]·职业发展不要自找烦恼
- 读易[20]·职业发展不要自找烦恼
- 用css控制图片大小 让你不要再为图片变形烦恼
- 基于tcp/ip协议的网络编程的一点感悟 ---关于ip和port作为通讯一端的唯一标识的认识
- NDatabase 入门,简单使用 增删改查。让NDatabase带你脱离ADO.net,各种SQL 语句,各种DBMS,各种CRM,IOC之类的烦恼。我们也不需要仓库设计模式了,你妹的。不要表了,不要设计数据库字段了。就这样!
- 读易[20]·职业发展不要自找烦恼
- 烦恼的、在意的事,不要去想它
- 不要使用无法唯一表示的 order by 来排序
- 每个人都有唯一的价值,请珍惜自己 我们体会到,尽管我们个人是微不足道的,但是,无论发生了什么或将要发生什么事情,你永远都不要失去你存在的价值。请记住;你是唯一的。
- 不要把烦恼叠加在一起
- 读易[20]·职业发展不要自找烦恼
- 5.不要预支明天的烦恼
- 不要去预见烦恼或担心可能永远不会发生的事情。置身于明媚的阳光之中吧。
- 不要为小事而烦恼
- 不要预支烦恼
- 「简书」联合创始人赵波:不要活在烦恼里,逼自己做决定
- 读易[20]·职业发展不要自找烦恼
- 读易[20]·职业发展不要自找烦恼
- 读易[20]·职业发展不要自找烦恼
- 读易[20]·职业发展不要自找烦恼