不管Java还是Android的网络编程必然涉及到Socket,Http,下面就谈谈自己的理解。
本文不涉及网络通信7层协议,感兴趣的读者可以自行百度。
Socket
Socket,也叫套接字,它是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元(书上就这样说的),它是网络通信过程中端点的抽象表示,包含进行网络通信必须的5种信息:连接使用的协议,本地主机的IP地址,本地进程协议端口,远程主机的Ip地址,远程进程的协议端口。
- 为什么需要Socket
应用层通过传输层(TCP/UDP)进行通信时,TCP会遇到同时为多个应用程序提供服务的并发问题,多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口进行传输数据。为了区分不同的应用程序和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了Socket接口,区分来自不同应用程序或网络连接的通信,实现数据传输的并发服务。
**通俗的说,网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。 - 三次握手(listen,connect,accept)
建立socket至少需要一对套接字,客户端的是ClientSocket(android中就是socket),服务端的是ServerSocket。
套接字的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:Server端Listen(监听)某个端口是否有连接进来;
客户端请求:Client向Server端发起connect(请求);
连接确认:Server向Client发出accept(确认)消息;
这样,一个连接就建立起来了,下面就可以进行通信了。
Http协议
Http协议是建立在TCP协议上的一种应用。
在HTTP1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
- 短连接
因为Http在每次请求结束后会主动释放连接,因此它是"短连接",要保持客户端程序的在线状态,需要不断的向服务器发起请求。
对比
1.由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致Socket 连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
2.HTTP连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
3.很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。此时若双方建立的是Socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是HTTP连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。