关键字: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. GPIO基础知识

    STM32 GPIO入门知识 GPIO是什么? 通用输入输出端口,可以做输入,也可以做输出.GPIO端口可通过程序配置成输入或输出. 引脚和GPIO的区别和联系 STM32的引脚中,有部分是做GPIO ...

  2. Android面试收集录4 Fragment详解

    1.什么是Fragment? 你可以简单的理解为,Fragment是显示在Activity中的Activity. 它可以显示在Activity中,然后它也可以显示出一些内容. 因为它拥有自己的生命周期 ...

  3. 探究SynchronizationContext在.Net异步编程中的地位

    原文:探究SynchronizationContext在.Net异步编程中的地位 引言: 多线程编程/异步编程非常复杂,有很多概念和工具需要去学习,贴心的.NET提供Task线程包装类和await/a ...

  4. OpenCV学习笔记(十一) 轮廓操作

    在图像中寻找轮廓 首先利用Canny算子检测图像的边缘,再利用Canny算子的输出作为 寻找轮廓函数 findContours 的输入.最后用函数 drawContours 画出轮廓.边界Counto ...

  5. 4 . GET方法实现文章分类

    复习:博客站点 <!DOCTYPE html> {% load staticfiles %} <html> <head> <meta charset=&quo ...

  6. Web安全1&沙箱隔离

    1.web安全 Web安全的本质是信任问题 •由于信任,正常处理用户恶意的输入导致问题的产生 •非预期的输入(就是不是程序员预期的客户的输入) 安全是木桶原理,短的那块板决定的木桶世纪能装多少水,同样 ...

  7. 《Cracking the Coding Interview》——第9章:递归和动态规划——题目1

    2014-03-20 02:55 题目:小朋友跳台阶,每次跳1层或2层,那么跳N层总共有多少种跳法. 解法:斐波那契数列. 代码: // 9.1 A child can run up the stai ...

  8. (原)App源码

    序) 人生就像卫生纸,有事没事少扯 前言) 最近偶尔和一位极客大牛聊了一次,这个极客在汇编的造诣算是相当高,不过野路子出来看不起各种规矩,因此是适合做个自己蒙头研究技术的极客男,不适合大型团队,不适合 ...

  9. Nuget.config格式错误,请检查nuget.config配置文件

    安装 VS 2015 Professional 版,安装后,我想加一个nuget的包配置. 然后提示我:Nuget.config格式错误,请检查nuget.config配置文件 我找到了 Nuget. ...

  10. PYTHON -MYSQLDB安装遇到的问题和解决办法

    目前下载的mysqldb在window下没有exe安装包了,只有源码. 使用python setup.py install 命令安装, 报错如下: 异常信息如下: F:\devtools\MySQL- ...