关键字: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. [Hdu1166]敌兵布阵(CQD分治)

    CQQ分治 Code #include <cstdio> #include <cstring> #define N 50010 struct info{ int x,p,v; ...

  2. TouTiao开源项目 分析笔记10 实现通用普通文章片段页面

    1.RxJava的Observable数据操作符总结 1.1.Map操作符 Map操作符对原始Observable发射的没一项数据应用一个你选择的函数, 然后返回一个发射这些结果的Observable ...

  3. Mysql 表转换成 Sqlite表

    目前的转换仅仅支持对没有外键的Mysql数据表 准备: 下载安装 Sqlite Expert 软件 一 获取Mysql中的.sql文件,获取过程省略可以直接导出sql文件 二 在Sqlite Expe ...

  4. Eclipse EE 运行 Myeclipse Web 应用

    第一步:进入项目所在目录,打开.project文件,找到<natures>...</natures>标签,在中间添加如下子标签内容 <nature>org.ecli ...

  5. Codeforces 787D Legacy 线段树 最短路

    题意: 有\(n(1 \leq n \leq 10^5)\)个点,\(q(1 \leq q \leq 10^5)\)条路和起点\(s\) 路有三种类型: 从点\(v\)到点\(u\)需要花费\(w\) ...

  6. 简易版AI英文问答程序解决

    第四章的作业和实践题要论印象深刻无疑就是AI的那道题了.不得不说一开始看到题目的时候,我真的蒙了很久. 本题要求你实现一个简易版的 AI 英文问答程序,规则是: 1.无论用户说什么,首先把对方说的话在 ...

  7. X-Frame-Options是什么?

    错误: Refused to display 'http://xx.com/spot/kline.do' in a frame because it set 'X-Frame-Options' to ...

  8. Java中String类new创建和直接赋值字符串的区别

    转自:https://blog.csdn.net/a986410589/article/details/52454492 方式一:String a = “aaa” ; 方式二:String b = n ...

  9. unbantu安装wmvare

    最新评论 wsmyyjie:写的太好了!!! zhangmin92:回复 wopapa523: 这个是你用另一.. wopapa523:请问i11是在哪里输入的? myh65013:挺深入的 andk ...

  10. 《Cracking the Coding Interview》——第8章:面向对象设计——题目2

    2014-04-23 17:45 题目:假设有个呼叫中心,有接线员.经理.主管三种角色.如果接线员无法处理呼叫,就上传给经理:如果仍无法处理,则上传给主管.请用代码描述这一过程. 解法:第一眼觉得这题 ...