• 【转】iOS基于WebSocket的聊天机制


    原文网址:http://www.jianshu.com/p/21d9b3b94cfc

    WebSocket 的使得浏览器提供对 Socket 的支持成为可能,从而在浏览器和服务器之间提供了一个基于 TCP 连接的双向通道。Web 开发人员可以非常方便地使用 WebSocket 构建实时 web 应用。

    1.WebSocket 机制

    以下简要介绍一下 WebSocket 的原理及运行机制。

    WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 最大不同是:

    WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Socket 一样;

    WebSocket 需要类似 TCP 的客户端和服务器端通过握手连接,连接成功后才能相互通信。

    使用 WebSocket 模式客户端与服务器的交互如下图:


     

    WebSocket 是类似 Socket 的 TCP 长连接的通讯模式,一旦 WebSocket 连接建立后,后续数据都以帧序列的形式传输。在客户端断开 WebSocket 连接或 Server 端断掉连接前,不需要客户端和服务端重新发起连接请求。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

    2.在iOS中WebSocket的具体实现

    1>下载WebSocket的sdk,并导入工程里面

    2>在聊天的控制器里导入头文件代理等

    3>具体使用

    //连接端口

    _webSocket.delegate = nil;

    [_webSocket close];

    _webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"ws://www.qsjia.com:7272"]]];

    _webSocket.delegate = self;

    [_webSocket open];

    NSLog(@"open success!");

    [self webSocketDidOpen:_webSocket];

    //实现代理方法

    #pragma SRWebSocketDelegate

    //连接成功

    - (void)webSocketDidOpen:(SRWebSocket *)webSocket;

    {

    NSLog(@"Websocket Connected");

    }

    //连接失败

    - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;

    {

    NSLog(@":( Websocket Failed With Error %@", error);

    _webSocket = nil;

    }

    //接收到新消息的处理

    - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;

    {

    NSLog(@"Received "%@"", message);

    self.str = message;

    self.myMessage = [ChatViewController dictionaryWithJsonString:self.str];

    self.ping = [self.myMessage objectForKey:@"type"];

    if ([self.ping isEqualToString:@"say"]) {

    [self addMessage];

    [self.arr enumerateObjectsUsingBlock:^(PersonDetail*  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

    if ( [obj.myid integerValue] == [self.myMessage[@"roomid"] integerValue]) {

    [self.arr exchangeObjectAtIndex:idx withObjectAtIndex:0];

    }

    }];

    [self.tableView reloadData];

    }

    //[self.tableView reloadData];

    }

    //连接关闭

    - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;

    {

    NSLog(@"WebSocket closed");

    //self.title = @"Connection Closed! (see logs)";

    _webSocket = nil;

    }

    //登录服务器要发送的字符串(根据具体后台设置)

    //获取UserDefault

    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

    NSString *uid = [userDefault objectForKey:@"uid"];

    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"login",@"type",@"1",@"room_id",uid,@"client_name", nil];

    [dic enumerateKeysAndObjectsUsingBlock:^(NSString * key, id obj, BOOL *stop) {

    if ([key isEqualToString:@"client_name"]) {

    [dic setValue:@([uid intValue]) forKey:@"client_name"];

    }else if ([key isEqualToString:@"room_id"]){

    [dic setValue:@([@"1" intValue]) forKey:@"room_id"];

    }

    }];

    NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:NULL];

    NSString *string = [[ NSString alloc ] initWithData :data encoding : NSUTF8StringEncoding];

    //NSLog(@"%@",string);

    [_webSocket send:string];

    //退出服务器要发送的字符串

    NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"loginout",@"type",nil];

    NSData *data = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:NULL];

    NSString *string = [[ NSString alloc ] initWithData :data encoding : NSUTF8StringEncoding];

    [_webSocket send:string];

    webSocket一般是配合数据库一起使用的,实现的逻辑要根据具体情况来确定的.



    文/1seven(简书作者)
    原文链接:http://www.jianshu.com/p/21d9b3b94cfc
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
  • 相关阅读:
    Mac上使用Charles抓取https
    使用react-navigation 报错isMounted
    create-react-app创建出来项目,如何设置CSS模块化?
    Markdown 常用语法整理
    Git安装和使用
    页面重定向跳转
    AntDesign 踩坑大全
    js实现数组、对象深度克隆的两种办法
    wamp中mysql安装时能启动,重启后无法启动的解决办法
    前端开发工具收藏
  • 原文地址:https://www.cnblogs.com/wi100sh/p/5995521.html
Copyright © 2020-2023  润新知