关键字: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. 20145202马超 《Java程序设计》第五周学习总结

    异常:程序在运行的时候出现不正正常的情况 由来:问题也是可以通过java对不正常情况进行描述后的对象的体现. 问题的划分:(1).严重的问题,java通过error类进行描述,对于error一般不编写 ...

  2. JS 金钱格式化

    JavaScript Money Format(用prototype对Number进行扩展) Number.prototype.formatMoney = function (places, symb ...

  3. 一个简单的同步集群的shell脚本

    编写一个xsync文件 然后放在/usr/local/bin 目录下面 xsync文件如下: #!/bin/bash #1 获取输入参数个数,如果没有参数,直接退出 pcount=$# if((pco ...

  4. ceph 存储系统

    http://w w w.c s d n 123.com/html/topnews201408/2/4702.htm

  5. 通过学习制作长微博工具来了解水印的制作,及EditText中的内容在图片中换行显示

    长微博工具非常有用,140字的要求可能阻止你写更多的内容,于是长微博工具应运而生,虽然网上有很多长微博工具,但是我都不是很满意,所以自己想做一个,通过做这个长微博工具,我学习到了很多东西,有两个难点, ...

  6. js实现类bootstrap模态框动画

    在pc端开发,模态框是一个很常用的插件,之前一直用的第三方插件,比如bootstrap,jQuery的模态框插件,最近还用了elementUI的.但是会发现其实动画效果都差不多,那么如何去实现这样一个 ...

  7. python之上下文管理、redis的发布订阅、rabbitmq

    使用with打开文件的方式,是调用了上下文管理的功能 #打开文件的两种方法: f = open('a.txt','r') with open('a.txt','r') as f 实现使用with关闭s ...

  8. 孤荷凌寒自学python第十天序列之字符串的常用方法

    孤荷凌寒自学python第十天序列之字符串的常用方法 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) Python的字符串操作方法非常丰富,原生支持字符串的多种操作: 1 查找子字符串 str ...

  9. (转)KlayGE游戏引擎 :高效的GBUFFER管理方式

    转载请注明出处为KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=3304 个顶点.这样的数据对GPU来说是很头疼的.所以引擎往往需要在Buffer上做一些工作来 ...

  10. 201621123034 《Java程序设计》第6周学习总结

    作业06-接口.内部类 1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多 ...