Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信。两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据。而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求。 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信。通过建立socket连接,可为通信双方的数据传输传提供通道。socket的主要特点有数据丢失率低,使用简单且易于移植。

Socket是一种抽象层,应用程序通过它来发送和接收数据,使用Socket可以将应用程序添加到网络中,与处于同一网络中的其他应用程序进行通信。简单来说,Socket提供了程序内部与外界通信的端口并为通信双方的提供了数据传输通道。

Socket类型为流套接字(streamsocket)和数据报套接字(datagramsocket)。流套接字将TCP作为其端对端协议,提供了一个可信赖的字节流服务。数据报套接字使用UDP协议,提供数据打包发送服务

基于TCP协议的Socket

1)服务器端首先声明一个ServerSocket对象并且指定端口号,然后调用Serversocket的accept()方法接收客户端的数据。accept()方法在没有数据进行接收的处于堵塞状态。(Socketsocket=serversocket.accept()),一旦接收到数据,通过inputstream读取接收的数据。

2)客户端创建一个Socket对象,指定服务器端的ip地址和端口号(Socketsocket=newSocket(“172.168.10.108”,8080);),通过inputstream读取数据,获取服务器发出的数据(OutputStreamoutputstream=socket.getOutputStream()),最后将要发送的数据写入到outputstream即可进行TCP协议的socket数据传输。

基于UDP协议的数据传输

1)服务器端首先创建一个DatagramSocket对象,并且指点监听的端口。接下来创建一个空的DatagramSocket对象用于接收数据(bytedata[]=newbyte[1024;]DatagramSocketpacket=newDatagramSocket(data,data.length)),使用DatagramSocket的receive方法接收客户端发送的数据,receive()与serversocket的accepet()类似,在没有数据进行接收的处于堵塞状态。

2)客户端也创建个DatagramSocket对象,并且指点监听的端口。接下来创建一个InetAddress对象,这个对象类似与一个网络的发送地址(InetAddressserveraddress=InetAddress.getByName(“172.168.1.120”)).定义要发送的一个字符串,创建一个DatagramPacket对象,并制定要讲这个数据报包发送到网络的那个地址以及端口号,最后使用DatagramSocket的对象的send()发送数据。

WebSocket:

我们知道,在网络中的两个应用程序(进程)需要全双工相互通信(全双工即双方可同时向对方发送消息),需要用到的就是socket,它能够提供端对端通信,对于程序员来讲,他只需要在某个应用程序的一端(暂且称之为客户端)创建一个socket实例并且提供它所要连接一端(暂且称之为服务端)的IP地址和端口,而另外一端(服务端)创建另一个socket并绑定本地端口进行监听,然后客户端进行连接服务端,服务端接受连接之后双方建立了一个端对端的TCP连接,在该连接上就可以双向通讯了,而且一旦建立这个连接之后,通信双方就没有客户端服务端之分了,提供的就是端对端通信了。我们可以采取这种方式构建一个桌面版的im程序,让不同主机上的用户发送消息。从本质上来说,socket并不是一个新的协议,它只是为了便于程序员进行网络编程而对tcp/ip协议族通信机制的一种封装。

websocket是html5规范中的一个部分,它借鉴了socket这种思想,为web应用程序客户端和服务端之间(注意是客户端服务端)提供了一种全双工通信机制。同时,它又是一种新的应用层协议,websocket协议是为了提供web应用程序和服务端全双工通信而专门制定的一种应用层协议,通常它表示为:ws://echo.websocket.org/?encoding=text HTTP/1.1,可以看到除了前面的协议名和http不同之外,它的表示地址就是传统的url地址。

既然是基于浏览器端的web技术,那么它的通信肯定少不了http,websocket本身虽然也是一种新的应用层协议,但是它也不能够脱离http而单独存在。具体来讲,我们在客户端构建一个websocket实例,并且为它绑定一个需要连接到的服务器地址,当客户端连接服务端的时候,会向服务端发送一个类似下面的http报文,注意该报文中有一个upgrade首部,它的作用是告诉服务端需要将通信协议切换到websocket,如果服务端支持websocket协议,那么它就会将自己的通信协议切换到websocket,同时发给客户端类似于以下的一个响应报文头,返回的状态码为101,表示同意客户端协议转换请求,并将它转换为websocket协议。以上过程都是利用http通信完成的,称之为websocket协议握手(websocket Protocol handshake),进过这握手之后,客户端和服务端就建立了websocket连接,以后的通信走的都是websocket协议了。所以总结为websocket握手需要借助于http协议,建立连接后通信过程使用websocket协议。同时需要了解的是,该websocket连接还是基于我们刚才发起http连接的那个TCP连接。一旦建立连接之后,我们就可以进行数据传输了,websocket提供两种数据传输:文本数据和二进制数据。

基于以上分析,我们可以看到,websocket能够提供低延迟,高性能的客户端与服务端的双向数据通信。它颠覆了之前web开发的请求处理响应模式,并且提供了一种真正意义上的客户端请求,服务器推送数据的模式,特别适合实时数据交互应用开发。

WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 最大不同是:

WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Socket 一样;

WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信。

相对于传统 HTTP 每次请求-应答都需要客户端与服务端建立连接的模式,WebSocket 是类似 Socket 的 TCP 长连接的通讯模式,一旦 WebSocket 连接建立后,后续数据都以帧序列的形式传输。在客户端断开 WebSocket 连接或 Server 端断掉连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

在客户端,new WebSocket 实例化一个新的 WebSocket 客户端对象,连接类似 ws://yourdomain:port/path 的服务端 WebSocket URL,WebSocket 客户端对象会自动解析并识别为 WebSocket 请求,从而连接服务端端口,执行双方握手过程,可以看到,客户端发起的 WebSocket 连接报文类似传统 HTTP 报文,”Upgrade:websocket”参数值表明这是 WebSocket 类型请求,“Sec-WebSocket-Key”是 WebSocket 客户端发送的一个 base64 编码的密文,要求服务端必须返回一个对应加密的“Sec-WebSocket-Accept”应答,否则客户端会抛出“Error during WebSocket handshake”错误,并关闭连接。

最后做下小广告:BAT大咖助力 全面升级Android面试

这是我android面试视频课程,大家可以看看,里面涵盖了绝大部分的内容

Android端发送字符到Wed端,Android面试-socket和websocket相关推荐

  1. Android端发送字符到Wed端,android应用端向web端获取字符串。

    一 发送和接收普通的JSONArray(仅仅包含字符串的数组) 1)web端: PrintWriter out = response.getWriter(); List orderAllList = ...

  2. android mqtt服务器搭建,Mqtt从服务端到Android客户端搭建(mqtt服务端搭建)

    一.简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议. 此处不再引入官方文字描述,以个人开发认识浅谈一下 本文分为两部分: 1. M ...

  3. 【Android RTMP】RTMP 直播推流阶段总结 ( 服务器端搭建 | Android 手机端编码推流 | 电脑端观看直播 | 服务器状态查看 )

    文章目录 安卓直播推流专栏博客总结 一. 服务器搭建 二. 手机端推流 三. 电脑端观看直播 四. RTMP 服务器端状态 安卓直播推流专栏博客总结 Android RTMP 直播推流技术专栏 : 0 ...

  4. android binder - 客户端(c++层) 调用 服务端(java层),服务端回调客户端 例子

    学习了: android binder - 客户端(java层) 调用 服务端(c++层) 例子 http://blog.csdn.net/ganyue803/article/details/4131 ...

  5. 一种基于Android、iOS系统的移动端车牌识别方法,实现手机拍照识别车牌

    随着移动行业的爆发式发展,手机配置不断提高,基于手机平台的信息采集.图像处理.数据传输等方面的研究也成为了热点,这使得基于手机平台上的车牌识别成为可能.传统的车牌识别系统一般都基于固定的桌面平台.图像 ...

  6. 一种基于Android、iOS平台的移动端车牌识别方法,能够在复杂背景下迅速识别多种车牌

    随着智慧城市愿景的推广,以及车辆管理需求的迅猛扩增,对于各类车辆识别系统有了新的要求.而以往的固定式特定设备的车牌识别系统已经不能够满足灵活的智能交通系统需求,例如路边停车管理和交管违章登记等.本文简 ...

  7. 基于SRS服务器实现Android-Web端视频通话(3):Android端向SRS服务器推送WebRTC流

    基于SRS服务器实现Android-Web端视频通话(3):Android端向SRS服务器推送WebRTC流 实现效果 引库 推流流程 代码实现 初始化 createPeerConnectionFac ...

  8. Android中的各种保活2-Android端外推送到底有多烦?

    Android端外推送到底有多烦? 原创  2016-08-06  张铁蕾  张铁蕾 http://mp.weixin.qq.com/s?__biz=MzA4NTg1MjM0Mg==&mid= ...

  9. 一种基于Android、iOS平台的移动端车牌识别接口,实现手机扫描提取车牌号

    车牌识别技术已经成为每个城市的车辆管理重点工作之一,有效.准确.及时的车牌识别为交通执法.停车场车辆管理等工作带来极大的便利.目前,一致基于Android.iOS系统的移动端车牌识别算法仅需手机摄像头 ...

最新文章

  1. python获取本机 ip地址、mac地址(物理地址)、计算机名、硬盘序列号、CPU序列号、主板序列号、bios序列号、bios uuid号
  2. 贵港天气预报软件测试,贵港天气预报15天
  3. Weblogic下创建JMS消息服务
  4. 数据结构与算法--力扣109题将有序双向链表转换为二叉搜索树
  5. HDMI光端机基本知识及相关品牌介绍
  6. java 年计算_java实现计算某年某月的天数
  7. (找循环节)Number Sequence
  8. 【原创】Elasticsearch无宕机迁移节点
  9. STM32CubeMX HAL库+STM32F407+uCOS-III移植
  10. 大学生计算机自我鉴定500字,大学生计算机专业的自我鉴定范文
  11. 可复用的显示隐藏按钮组件
  12. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(五)
  13. 查看电脑是否能插内存条
  14. mysql 1356错误_MySQL ERROR 1356 (HY000)
  15. 前端云原生——微信小程序云服务配置
  16. ubuntu 设置静态路由_ubuntu配置静态路由及重启生效
  17. Konga 使用说明
  18. 写一个程序来确定到底谁是凶手
  19. Mybatis配置驼峰影射作用
  20. 盘点丨全球政府机构十大网络安全事件

热门文章

  1. 全面详细的jQuery常见开发技巧手册
  2. 通向架构师的道路(第十二天)之Axis2 Web Service(三)
  3. 在同一基准下对前端框架进行比较(2019年更新)
  4. Django Channels 入门指南
  5. 第三方提权之serv-u提权
  6. dojo/request模块整体架构解析
  7. Good Technology 产品特色
  8. 那些年,我深爱着的PPT(一)
  9. Netbeans自定义mode
  10. 销售自动记帐凭证 - 三个常见问题