Socket套接字(二)
2018-12-29 本文已影响7人
春风依旧
一、Scoket简介
- Socket又称"套接字"
- 网络上两个程序通过一个"双向的通信连接实现数据交换"连接的一端称为socket
- 应用程序通常通过"套接字"向网络发出请求或者应答网络请求
-
Socket层上的协议是指数据传输的格式
Scoket.gif
二、网络通讯的要素
网络上的请求就是通过Socket来建立连接后互相通信
- IP地址 (网络上主机设备的唯一标识)
- 端口号(定位程序)
- 传输协议
- 通讯的规则
- TCP,UDP
三、Socket通信流程
Scoket流程.jpg1、服务器监听:
服务器端套接字并不定位具体的客户端套接字,
而是处于等待连接的状态(也就是上面的阻塞直到客户端连接),
实时监控网络状态,等待客户端的连接请求
2、客户端请求:
客户端初始化Socket提出连接请求,要连接的目标是服务器端的Socket。
3、连接确认:
当服务器端Socket监听到或者说接收到客户端Socket的连接请求时,就响应客户端Socket的请求,
建立一个新的线程,把服务器端Socket的描述发给客户端,一旦客户端确认了此描述,
双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
四、Socket连接后的几个机制:
1、心跳机制:
心跳一般是客户端每隔一定时间向服务端发送自定义指令,以判断双方是否存活,
因其按照一定间隔发送,类似于心跳一样,所以大家也就都叫它心跳机制
Socket选择TCP传输协议建立了连接,这个TCP协议有一个KeepAlive机制,下面文章也是很明确的指出了为什么不能用TCP协议的KeepAlive机制来做心跳的原因, 总结的观点是: TCP KeepAlive 是用于检测连接的死活,而不是用来检测连接是否可用!而我们的心跳就是为了检测连接死活的同时还要检测连接是否可用!最简单是定时心跳。
2、 PingPong机制:
这个的出现是为了在我们设置的这个心跳间隔之内出现了连接问题
①、当服务端发出一个Ping,客户端没有在约定的时间内返回响应的ack,则认为客户端已经不在线,这时我们Server端会主动断开Scoket连接,并且改由APNS推送的方式发送消息
②、同样当客户端去发送一个消息,因为我们迟迟无法收到服务端的响应ack包,则表明客户端或者服务端已不在线,我们也会显示消息发送失败,并且断开Scoket连接。
PingPong机制.png3、 断开重连
我们自己主动去断开的Scoket连接(退出登录,App退出到后台等等)是不需要重连。其他的连接断开,我们都需要进行断线重连,一般解决方案是尝试重连几次,如果仍旧无法重连成功,那么不再进行重连。