概述WebSocket
1.1 为什么我们需要WebSocket这样的实时的通信协议?
WebSocket是web通信方式的一种,像我们熟知的HTTP协议也是web通信方式的一种。但是我们知道HTTP协议是一种无状态的协议,其服务端本身不具备识别客户端的能力,必须借助外部的一些信息比如说session和cookie,才能与特定的客户端保持通信。也就是说我们所发送的每一个HTTP的请求都会带上请求头中一些相应的信息还有cookie,这明显会增加我们传输的信息的体量从而带来一定的网络延迟,对于一些对通信的实时性要求比较高的应用来说就是不可忍受的了,比如说聊天程序或者是运行在浏览器中的实时小游戏。最郁闷的却还是这些头信息和cookie往往对于服务器响应客户端的请求来说是多余的,也就是说虽然我每个请求都带了这些信息,但是服务器与客户端的交互过程中可能根本用不上这些信息。
为了改善HTTP请求的这种网络延迟的情况,也出现了一些适应不同需求的其他的[web通信]方式,比如说:轮询,长轮询(long-polling),数据流,EventSouce等等,WebSocket便是其中一种。
实际上大多数基于因特网(或者局域网)的网络链接通常都包含长连接和基于TCP套接字的双向消息交换。但是TCP协议是属于最底层的网络通信协议了,让一些不能信任的客户端脚本去访问底层的TCP套接字显然是不太安全的,因此WebSocket实现了一种较为安全的方案,它允许客户端脚本在客户端和支持WebSocket协议的服务器之间创建双向的套接字连接。从而使实时通信的某些网络操作变得简单。
1.2 WebSocket是如何工作的?
我们知道了WebSocket的主要作用是,允许服务器端与客户端进行全双工(full-duplex)的实时通信。这里有个例子特别好:HTTP协议像发电子邮件,发出后必须等待对方回信;WebSocket则是像打电话,服务器端和客户端可以同时向对方发送数据,它们之间存着一条持续打开的数据通道。
项目搭建
1.创建工程并导入pod框架添加SRWebSocket
platform:ios, '8.0'
use_frameworks!
inhibit_all_warnings! #取消三方框架导致的警告
target 'WebSocketDemo' do
pod 'SocketRocket'
end
2.SRWebSocket初始化设置
#import "ViewController.h"
#import <SocketRocket/SRWebSocket.h>
@interface ViewController ()<SRWebSocketDelegate>
@property (nonatomic, strong) SRWebSocket *webSocket;
@end
@implementation ViewController
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self webSocketConnect];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
self.webSocket.delegate = nil;
[self.webSocket close];
self.webSocket = nil;
}
// 初始化
- (void)webSocketConnect
{
self.webSocket.delegate = self;
[self.webSocket close];
self.webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"自己服务器聊天地址"]]];
self.webSocket.delegate = self;
self.title = @"Opening Connecting";
NSLog(@"------222------");
[self.webSocket open];
}
3.SRWebSocketDelegate
//连接成功
//代理方法实现
#pragma mark - SRWebSocketDelegate
- (void)webSocketDidOpen:(SRWebSocket *)webSocket
{
NSLog(@"WebSocket Connect");
self.title = @"Connected!";
}
// 连接失败
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error
{
NSLog(@"Websocket Failed With Error --- %@", error);
self.title = @"Connection Failed! (see logs)";
self.webSocket = nil;
}
// 接收到新消息的处理
- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
{
NSLog(@"接收到Message-----%@",message);
}
// 连接关闭
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
{
NSLog(@"Closed Reason:%@",reason);
self.title = @"Connection Closed! (see logs)";
self.webSocket = nil;
}
SRWebSocket 下载
扩展阅读
WebSocket
细说WebSocket
借助Nodejs探究WebSocketWeb 消息推送及 WebSocket 简介
WebSocket 是什么原理?为什么可以实现持久连接
ios 有关websocket的一些理解
接入WebSocket记录 + 一些个人经验
结束语
到这里就结束了,如若不懂的话可以👇留言,也可以加入群讨论
喜欢的话 记得关注、收藏、点赞哟
网友评论