android与PC直连的socket问题

关键字:abdroid 模拟器 socketjava

忽然有人说使用android的模拟器作socket服务器,PC作客户端,使用UDP通讯的时候,android端没法收到数据包。反过来没问题,我以为这怎么可能,首先若是你代码没问题的话,那就只有真实IP和端口有问题了。因而我搜索了一下,网上还真很多人问这个问题,我不得不说如今java程序员都被SSH毁了,不少已经到了不去思考的地步了,遇到问题想都不想一问,原来你也这样?既然你们都这样,那就说明没法解决了……….
特别是对java来讲开源库各类各样,不少人已经养成了不去思考和尝试的习惯,直接找现有的实现了。这样就彻底没有编程的乐趣了,哎,好了回到本文要点吧。首先对于TCP/UDP通讯来讲至少要有必定的知识。
首先在不考虑TCP/UDP的具体协议和实现方式、网络设备和OSI各类协议的前提下至少要明白java的SOCKET框架,固然SOCKET对于各类语言来讲道理是彻底同样的,只是底层实现不一样而已,到了java连socket的实现也不须要管了,只要知道类库怎么用就能够。
socket通讯至少须要两个前提,对方的IP和端口。这也是基要求,因此出问题了在排除代码问题以后只能是出如今这里了,固然还有就是你网络的物理结构没问题。而后是本文的使用范围,本文的范围是PC和android模拟器或者使用USB方式与真实android进行socket通讯。若是android链接上路由设备,与PC处于同等地位,对外有独立IP的状况下,好比WIFI。天然不在本文讨论范围,这时候你查看两个设备的IP而后指定端口链接就是了。
在此须要另外说明android设备的IP策略问题。当android设备与PC相连的的状况下,会默认PC的IP为10.0.2.2,自身的IP为10.0.2.15/127.0.1。也就是说android设备链接IP10.0.2.2就能够达到链接PC的效果,可是反过来,PC没法知道android的IP地址因此你没法使用某个默认值来主动向android设备发出链接请求。在想到这点时基本就明白接下来要怎么作了。
首先是TCP状况下,TCP是有链接状态的,因此任何一段链接创建成功就能够通讯。使用TCP/SOCKET链接android设备的场景不少,好比,在android设备中有一个本身的apk作socket服务器,而后再PC端的程序须要与其创建链接而后获取android设备的详细状况。这时候通常是用adb forward 将本机 TCP端口转发到android设备的TCP端口,这样在PC端就能够无需知道android设备的IP直接向本机,如127.0.0.1的某个端口发送数据包,以后端口转发机制会将其转发到android设备。这个很少说,没什么意思。
接下来是UDP,之因此着重说UDP,是由于UDP很是特殊。好在这里是与PC直连,可是adb forward不能转发UDP端口信息,只能是TCP…. 好吧,也正由于如此我发现了转发端口的基本命令redir。
redir add < udp/tcp >:< pc端口 >:< 模拟器端口 >,如redir add udp:1096:1097 redir tcp:1096:1097,做用就是将PC的1096端口转发到android设备的1097端口,固然两个端口号能够相同,由于他们是在两个不一样的设备上。可是有个缺点,就是不如adb forward灵活。操做过程以下:

如上图,PC端使用telnet命令链接到android设备,telnet须要的IP就是本机,端口可使用adb devices命令查看,链接成功以后可使用redir命令,有list、add、del几个参数,list如图就是列出存在的转发关系,add添加,del就是删除了,详细说明参考文档这里没必要多说。设置转发成功以后就有一个从PC看是1098的通讯端口,从android'设备看是1097通讯端口的直连通道。接下来上代码。

上图左侧为android代码,实现一个UDP/SOCKET的服务端,监听本地1097端口。右侧为PC端java代码直接向本机1098端口发送UDP数据包。两侧分别启动,在转发关系创建以前,android是不会受到UDP数据包。一旦转发关系1098:1097创建以后UDP服务端就会收到PC端的消息。

如上图所示,右侧控制台为PC端socket发送内容,左侧logcat为android设备中的socket服务器收到的内容。固然反过来,能够不须要转发直接向PC端发送消息。
以上。
ps,本人在实现过程当中,用android模拟器向PC主广播数据包时,PC接收不到,不知道各位有没有遇到这种状况,求解答!!
相关文章
相关标签/搜索