关键字:abdroid 模拟器 socket

突然有人说使用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接收不到,不知道各位有没有遇到这种情况,求解答!!

android与PC直连的socket问题的更多相关文章

  1. Android 手机应用开发经验 之 通过Socket(TCP/IP)与PC通讯

    Android 是一个开源的手机操作系统平台,已经被非常多的开发者视作未来最有潜力的智能手机操作系统.而且,在很短的时间内就在Android Market上出现大量的第三方应用程序,供用户下载与使用, ...

  2. ProtocolBuffers (二) android与PC,C#与Java 利用protobuf 进行无障碍通讯【Socket】

    protobuf 是什么?   Protocol buffers是一种编码方法构造的一种有效而可扩展的格式的数据. 谷歌使用其内部几乎RPC协议和文件格式的所有协议缓冲区. 参考文档 http://c ...

  3. 关于Android与pc通信时中文乱码的分析和解决

    初步实现了Android与pc服务器的通信之后,又碰到了传说中令人头疼不已的中文乱码问题.既然出现了乱码,那么原因自然是协议不通了.我们知道eclipse中默认的编码标准是GBK,而安卓程序开发所默认 ...

  4. PHP判断iPhone、iPad、Android、PC设备的方法

    因为工作需要我们需要知道是什么样了用户访问了我网站了,现在的移动设备种类多了,下面我们一起来看小编整理的一段php判断iPhone.iPad.Android.PC设备的例子. 注意:本代码的PC系统为 ...

  5. webrtc 它android与PC互通

    折腾了一个多星期,今天终将PC和android音频,视频全部打通. 到现在,android与android,pC与PC,android与PC之间已经解决了互通,的音频和视频是能够. 前段时间开了PC与 ...

  6. Juniper srx新增接口IP,使PC直连srx(转)

    转自:https://www.jianshu.com/p/bc27134bde3d Juniper srx新增接口IP,使PC直连srx 2018.11.19 14:24:15字数 424 概述 需求 ...

  7. Android客户端与Eclipse服务器端的Socket通信

    Server端代码 用来实现客户端socket的监听 package MyServer; import java.io.BufferedReader; import java.io.BufferedW ...

  8. android通过pc脚本执行sqlite3脚本

    最近在调研市面上的一些android db框架,需要经常重复的输入一堆比如 adb shell cd /data/data/com.example.testandroiddb/databases sq ...

  9. Android HTTPS(4)直接用SSLSocket,黑名单,客户端证书

    Warnings About Using SSLSocket Directly So far, the examples have focused on HTTPS using HttpsURLCon ...

随机推荐

  1. Aizu:0189-Convenient Location

    Convenient Location Time limit 1000 ms Memory limit 131072 kB Problem Description 明年毕业的A为就业而搬家.就职的公司 ...

  2. 笔记-DB-mongodb-常用操作-1

    笔记-DB-mongodb-常用操作-1 1.  启动及连接 1.1.  启动 启动mongod windows下: 1.   如已添加服务 net start <service name> ...

  3. python基础之继承组合应用、对象序列化和反序列化,选课系统综合示例

    继承+组合应用示例 1 class Date: #定义时间类,包含姓名.年.月.日,用于返回生日 2 def __init__(self,name,year,mon,day): 3 self.name ...

  4. 奇异值分解(SVD)原理详解及推导

    在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有需要补充的,特别是关于矩阵和映射之间的对应关系.前段时间看了国外的一篇文章,叫A Singularly Valuable Decompos ...

  5. tp事务处理

    数据库事务处理见手册 逻辑事务处理 Model->startTrans(); // 开启事务 if(操作失败) { Model->rollback(); // 回滚 }else { Mod ...

  6. easyui js拼接html,class属性失效的问题

    问题:要在前一个按钮之后添加相同的样式的按钮,通过$("#cj").html(str); 这样的形式添加,却不能添加上样式 <div id="btn" c ...

  7. SetConsoleCtrlHandler

    Excerpt: Registering a Control Handler Function   This is an example of the SetConsoleCtrlHandler fu ...

  8. 一个Objective-C对象如何进行内存布局?(考虑有父类的情况)

    1.对象isa指向类对象,类对象的isa指向元类.元类isa指向根元类.根元类的isa指针指向自己,superclass指针指向NSObject类 2.实例对象结构体只有一个isa变量,指向实例对象所 ...

  9. python+selenium安装指导

    一.      安装python 1.Window 平台安装 Python 以下为在 Window 平台上安装 Python 的简单步骤: 打开 WEB 浏览器访问https://www.python ...

  10. springboot生成表结构

    https://blog.csdn.net/yalishadaa/article/details/59656332