位置: 编程技术 - 正文

Android Socket 通信实例...【Pnoker】(androidsocket原理)

编辑:rootadmin

推荐整理分享Android Socket 通信实例...【Pnoker】(androidsocket原理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android socket编程,android socketserver,android socket聊天,android中socket,android socket 接收数据,android socketserver,android tcp socket,android socket 接收数据,内容如对您有帮助,希望把文章链接给更多的朋友!

这几天一直在学习Java套接字,昨天做了个小实验,发现仅简单的把Java Socket通信的代码放在Android上是会报错的,而且问题还很大,于是乎,我就搜集了一些资料发现,要想实现Android Socket 还得注意一下几点。

下来我们就具体实施一下,本人一贯认为,实践才是硬道理,不过理论知识也是很重要的,首先讲讲理论知识,有助于你理解。

Socket

Socket(套接字)是一种通信机制,可以实现单机或跨网络进行通信,其创建需要明确的区分C(客户端)/S(服务器端),支持多个客户端连接到同一个服务器。有两种传输模式:

面向连接的传输:基于TCP协议,可靠性高,但效率低;面向无连接的传输:基于UDP协议,可靠性低,但效率高;

Android中,直接采用Socket通信应该是我们遇到的最低级的网络运用。尽管已经作了很大程度的抽象,但是纯粹的Socket通信,仍然给开发者留下很多细节需要处理,尤其在服务器端,开发者需要处理多线程以及数据缓冲等的设计问题。相对而言,处于更高抽象层的HTTP等,已经对Socket通信中需要处理的技术细节进行了很好的封装,开发者无须关心,因此,HTTP在网络开发中通常具有决定性的优势。

Android在其核心库的java包中,提供了用于客户端的Socket class和用于服务器端的ServerSocket class,分别位于: $SOURCE/libcore/luni/src/main/java/java/net/Socket.java $SOURCE/libcore/luni/src/main/java/java/net/ServerSocket.java 文件中。 分析两个class的源码,可以看出封装考虑的很全面,只构造方法一向每个class都考虑了很多种使用情况。由于本人只是初学者,很多理解的不深入,这里只抛砖引玉的对两个class的构造方法分别介绍一种,就是我下面的程序中用到的:

Socket(String dstName, int dstPort):创建一个以流的方式(基于TCP协议)连接到目标机(这里可以理解为服务器)的客户端Socket;dstName是目标机的IP地址,dstPort是要连接的目标机的端 口号。这里要注意对端口的理解,它不能理解为物理上的一个接口,而是对计算机中一块特殊内存区域的形象表述。

ServerSocket(int aport):创建一个绑定到本机指定端口的服务端Socket;aport就是指定的本机端口。与上述客户端Socket对应,通过TCP连接时,ServerSocket创建后需要在aport端口上进行监听,等待客户端的连接。

功能描述简单的基于Socket的数据通信;采用TCP方式连接;采用C/S结构,但服务端只支持一个连接;客户端能够向服务端发送数据,并显示服务端的返回信息;服务端能够接收客户端的数据,并将收到的数据以特定的方式返回给客户端;程序实现思路服务端:设计为在后台执行的service,用一个独立的线程来处理客户端的连接请求、数据接收和返回。为了启动该service,编写个简单的Activity。客户端:设计为一个Activity,界面由三部分组成:显示服务端返回信息的文本区域(一个文本框);进行数据输入的编辑区域(一个编辑框);以及触发连接请求并执行数据发送的触发区域(一个按钮)。问题分析

(这一步很重要,正是应为这种问题,才导致Android 用用程序报错)

回顾线程创建

继承 Thread 类,覆盖方法 run(),我们在创建的 Thread 类的子类中重写 run() ,加入线程所要执行的代码即可。下面是一个例子:

回顾Runable()接口方法

实现 Runnable 接口 Runnable 接口只有一个方法 run(),我们声明自己的类实现 Runnable 接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。但是 Runnable 接口并没有任何对线程的支持,我们还必须创建 Thread 类的实例,这一点通过 Thread 类的构造函数public Thread(Runnable target);来实现。下面是一个例子:

Android Socket 通信实例...【Pnoker】(androidsocket原理)

Runnable说白了只是个回调接口,并不是所有的Runnable都是用于线程的;如果把它做为线程:传给Thread类传给Executor类

要把Handle对象传递的东西放在一个消息循环的队列当中,如果没有这个消息循环队列的话,就会报错!

在做比较简单线程通讯的时候,我们只是在主Activity线程中使用Handler.sendMessage(Message)方法来实现消息的发送,用Handler.handleMessage(Message)类实现消息的获取,这似乎没有什么错误,而且如果在我们自己开启的普通线程中向主Activity线程发送消息似乎也不会有什么错误,可以捕获我们想要的消息。 3.但是如果我们接收消息的线程不在主线程那么而是一个普通线程,那么就会报错。为什么会这样呢?原因就是因为在我们自定义的普通线程中没有消息循环队列。那么怎么来实现一个消息循环队列呢?(假设我们都复写了handleMessage(Message)方法)

这是最简单的方法,是在实例化Handler对象的时候传入调用HandlerThread.getLooper()获得的Looper对象,这个Looper就是我们需要的消息循环队列。当然这个HandlerThread对象必须调用start()方法去让他开启的线程运行。

这个方法是模仿HandlerThread类的run()方法写出来的。就是在定义Handler对象的前加上Looper.prepare()方法,让消息循环开始准备,在定义完以后在调用Looper.loop();然消息循环开始运行。其实这两个方法本质上是没有没有区别的,都是给一个普通线程添加了一个消息队列。

代码实例解析

Android APP当客户端进行数据的发送 Java程序当服务器端进行数据的接收

以下是Android Project下的代码实例:

MainActivity.java

activity_main.xml

AndroidManifest.xml

以下是Java Project下的代码实例:

Server.java

运行结果

版权声明:本文为博主原创文章,未经博主允许不得转载。

迁移项目到Android Studio 由于公司项目需要多包名APK的支持,所以把公司的项目从eclipse迁移到了AndroidStudio.以下是一些迁移经验:迁移准备AndroidStudio对代码检查比较严格,代码

Android四大组件之内容提供者--ContentProvider Android四大组件之内容提供者--ContentProvider1,什么是ContentProviderContentProvider将应用中的数据对其它应用进行共享,提供增删改查的方法ContentProvider统一了数

加快Android Studio的编译速度 从Eclipse切换到AndroidStudio后,感觉AndroidStudio的build速度比Eclipse慢很多,以下几个方法可以提高AndroidStudio的编译速度使用Gradle2.4Gradle2.4对执行性能有很大

标签: androidsocket原理

本文链接地址:https://www.jiuchutong.com/biancheng/374364.html 转载请保留说明!

上一篇:Android自定义View圆环带文字进度条(android自定义view ondraw有时候不执行)

下一篇:迁移项目到Android Studio(迁移的项目)

  • 进料加工贸易流程
  • 偶然所得纳税计算
  • 业务活动成本和业务活动费用的区别
  • 增值税的税目有哪些类型
  • 固定资产一次性计入费用的账务处理
  • 扣缴附加税怎么做分录
  • 创立一个公司,公司的运营理念
  • 注销实收资本账务处理
  • 固定资产残值怎么处理什么时候处理
  • 中兴通技术维护费
  • 企业所得税计算方法举例说明
  • 水泥销售成本怎么算
  • 以物易物差价印花税
  • 过期的费用发票怎么处理
  • 收到福利费会计分录
  • 违规费用处理
  • 银票贴现需要银行授信吗
  • 旅行社的税
  • 增值税如何进行抵扣
  • 免抵税额增值税主表体现到哪里的
  • 一般纳税人收到专票怎么做分录
  • 个人所得税的征收
  • 临时文件夹在哪个位置
  • 小规模纳税人销售自己使用过的固定资产税率
  • 设置系统自动更新一般通过什么窗口
  • php 签名算法
  • win7网络适配器不见了怎么恢复
  • 公司吸收合并股权
  • 在企业所得税前扣除的有哪些
  • 企业出售产品前,预收客户一笔货款
  • 百香果的副作用及禁忌是哪些
  • win11预览版dev改beta
  • 分期收款销售账务处理及税务处理
  • 发票交付在哪里
  • 公司收到个人汇款怎么办
  • 专利权出资会计科目
  • vue 使用高德地图
  • 职工工伤住院费用记什么科目
  • php 自动化测试
  • js数组菜鸟教程
  • php服务器地址怎么填
  • 本月没有销售收入,需要申报增值税吗
  • 淘宝天猫开票是普票还是专票
  • element remove
  • 深入分析原因,找出问题根源并有效破解
  • hashmap的使用场景
  • 建安企业确认收入的依据
  • 预付账款可以抵扣增值税么
  • 原始凭证如何粘贴在记账凭证正确粘法图解
  • 其他权益工具的公允价值变动计入哪里
  • 制造费用账户在月末一般没有余额
  • 投资收益记账
  • 开发成本的会计科目编码
  • 投资性房地产出租收入计入什么科目
  • 客户送我东西怎么办
  • 固定资产报废会计
  • 固定资产抵扣进项税额最新规定
  • 收银电脑怎么录商品
  • 管理费用科目余额表有余额怎么办
  • 关于财务报销的法律
  • 低值易耗品和物资的关系
  • 理财中的非保本是什么意思
  • 金蝶的核算项目是什么意思
  • OBJECTPROPERTY与sp_rename更改对象名称的介绍
  • ubuntu选择语言
  • 如何更改mac图标
  • linux查看sh
  • win7系统命令大全
  • 安卓优化清理大师怎么样
  • vscode 远程调试jni
  • android设置移动网络灰色是什么原因
  • 安卓手机管家哪个好用
  • Python 'takes exactly 1 argument (2 given)' Python error
  • python读写docx
  • jquery事件的响应
  • python中创建自定义函数
  • 国家税务2018年61号附件
  • 金米财税口碑如何?
  • 税务上门核查要看什么
  • 暂停资本化期间,一般借款的借款利息不允许资本化
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设