美文网首页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