美文网首页iOS 移动端开发
iOS简单的WebSocket连接

iOS简单的WebSocket连接

作者: SwordDevil | 来源:发表于2017-02-23 15:18 被阅读748次

概述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记录 + 一些个人经验


结束语

到这里就结束了,如若不懂的话可以👇留言,也可以加入群讨论
喜欢的话 记得关注、收藏、点赞哟

群号:552048526

相关文章

网友评论

  • Lazyloading:请问又在ios 搭建websocket服务端的经验吗 现在我们的需求是在ios搭建websocket服务端 但是搜遍了资料都没找到有ios的websocket服务端你的库
    SwordDevil:@Lazyloading 额 还有这说法呢啊 你可以发我一下 我试试
    Lazyloading:@SwordDevil 好吧 现在库找到了但是demo可以 实际应用不行 http可以https不行 chrome可以 safari不行......
    SwordDevil:@Lazyloading 这个还真没有~ 我搞的都是客户端

本文标题:iOS简单的WebSocket连接

本文链接:https://www.haomeiwen.com/subject/nfrbwttx.html