美文网首页傲视苍穹iOS《Objective-C》VIP专题iOSiOS高级开发
微信,QQ这类IM app怎么做——谈谈Websocket

微信,QQ这类IM app怎么做——谈谈Websocket

作者: 一缕殇流化隐半边冰霜 | 来源:发表于2016-05-15 18:55 被阅读37620次

    前言

    关于我和WebSocket的缘:我从大二在计算机网络课上听老师讲过之后,第一次使用就到了毕业之后的第一份工作。直到最近换了工作,到了一家是含有IM社交聊天功能的app的时候,我觉得我现在可以谈谈我对WebSocket/Socket的一些看法了。要想做IM聊天app,就不得不理解WebSocket和Socket的原理了,听我一一道来。

    目录

    • 1.WebSocket使用场景
    • 2.WebSocket诞生由来
    • 3.谈谈WebSocket协议原理
    • 4.WebSocket 和 Socket的区别与联系
    • 5.iOS平台有哪些WebSocket和Socket的开源框架
    • 6.iOS平台如何实现WebSocket协议
    一.WebSocket的使用场景

    1.社交聊天
    最著名的就是微信,QQ,这一类社交聊天的app。这一类聊天app的特点是低延迟,高即时。即时是这里面要求最高的,如果有一个紧急的事情,通过IM软件通知你,假设网络环境良好的情况下,这条message还无法立即送达到你的客户端上,紧急的事情都结束了,你才收到消息,那么这个软件肯定是失败的。
    2.弹幕
    说到这里,大家一定里面想到了A站和B站了。确实,他们的弹幕一直是一种特色。而且弹幕对于一个视频来说,很可能弹幕才是精华。发弹幕需要实时显示,也需要和聊天一样,需要即时。
    3.多玩家游戏
    4.协同编辑
    现在很多开源项目都是分散在世界各地的开发者一起协同开发,此时就会用到版本控制系统,比如Git,SVN去合并冲突。但是如果有一份文档,支持多人实时在线协同编辑,那么此时就会用到比如WebSocket了,它可以保证各个编辑者都在编辑同一个文档,此时不需要用到Git,SVN这些版本控制,因为在协同编辑界面就会实时看到对方编辑了什么,谁在修改哪些段落和文字。
    5.股票基金实时报价
    金融界瞬息万变——几乎是每毫秒都在变化。如果采用的网络架构无法满足实时性,那么就会给客户带来巨大的损失。几毫秒钱股票开始大跌,几秒以后才刷新数据,一秒钟的时间内,很可能用户就已经损失巨大财产了。
    6.体育实况更新
    全世界的球迷,体育爱好者特别多,当然大家在关心自己喜欢的体育活动的时候,比赛实时的赛况是他们最最关心的事情。这类新闻中最好的体验就是利用Websocket达到实时的更新!
    7.视频会议/聊天
    视频会议并不能代替和真人相见,但是他能让分布在全球天涯海角的人聚在电脑前一起开会。既能节省大家聚在一起路上花费的时间,讨论聚会地点的纠结,还能随时随地,只要有网络就可以开会。
    8.基于位置的应用
    越来越多的开发者借用移动设备的GPS功能来实现他们基于位置的网络应用。如果你一直记录用户的位置(比如运行应用来记录运动轨迹),你可以收集到更加细致化的数据。
    9.在线教育
    在线教育近几年也发展迅速。优点很多,免去了场地的限制,能让名师的资源合理的分配给全国各地想要学习知识的同学手上,Websocket是个不错的选择,可以视频聊天、即时聊天以及其与别人合作一起在网上讨论问题...
    10.智能家居
    这也是我一毕业加入的一个伟大的物联网智能家居的公司。考虑到家里的智能设备的状态必须需要实时的展现在手机app客户端上,毫无疑问选择了Websocket。
    11.总结
    从上面我列举的这些场景来看,一个共同点就是,高实时性!

    二.WebSocket诞生由来

    1.最开始的轮询Polling阶段

    这种方式下,是不适合获取实时信息的,客户端和服务器之间会一直进行连接,每隔一段时间就询问一次。客户端会轮询,有没有新消息。这种方式连接数会很多,一个接受,一个发送。而且每次发送请求都会有Http的Header,会很耗流量,也会消耗CPU的利用率。

    2.改进版的长轮询Long polling阶段

    长轮询是对轮询的改进版,客户端发送HTTP给服务器之后,有没有新消息,如果没有新消息,就一直等待。当有新消息的时候,才会返回给客户端。在某种程度上减小了网络带宽和CPU利用率等问题。但是这种方式还是有一种弊端:例如假设服务器端的数据更新速度很快,服务器在传送一个数据包给客户端后必须等待客户端的下一个Get请求到来,才能传递第二个更新的数据包给客户端,那么这样的话,客户端显示实时数据最快的时间为2×RTT(往返时间),而且如果在网络拥塞的情况下,这个时间用户是不能接受的,比如在股市的的报价上。另外,由于http数据包的头部数据量往往很大(通常有400多个字节),但是真正被服务器需要的数据却很少(有时只有10个字节左右),这样的数据包在网络上周期性的传输,难免对网络带宽是一种浪费。

    3.WebSocket诞生

    现在急需的需求是能支持客户端和服务器端的双向通信,而且协议的头部又没有HTTP的Header那么大,于是,Websocket就诞生了!

    上图就是Websocket和Polling的区别,从图中可以看到Polling里面客户端发送了好多Request,而下图,只有一个Upgrade,非常简洁高效。至于消耗方面的比较就要看下图了


    上图中,我们先看蓝色的柱状图,是Polling轮询消耗的流量,这次测试,HTTP请求和响应头信息开销总共包括871字节。当然每次测试不同的请求,头的开销不同。这次测试都以871字节的请求来测试。
    **Use case A: **1,000 clients polling every second: Network throughput is (871 x 1,000) = 871,000 bytes = 6,968,000 bits per second (6.6 Mbps)
    **Use case B: **10,000 clients polling every second: Network throughput is (871 x 10,000) = 8,710,000 bytes = 69,680,000 bits per second (66 Mbps)
    **Use case C: **100,000 clients polling every 1 second: Network throughput is (871 x 100,000) = 87,100,000 bytes = 696,800,000 bits per second (665 Mbps)
    而Websocket的Frame是 just two bytes of overhead instead of 871,仅仅用2个字节就代替了轮询的871字节!
    **Use case A: **1,000 clients receive 1 message per second: Network throughput is (2 x 1,000) = 2,000 bytes = 16,000 bits per second (0.015 Mbps)
    **Use case B: **10,000 clients receive 1 message per second: Network throughput is (2 x 10,000) = 20,000 bytes = 160,000 bits per second (0.153 Mbps)
    **Use case C: **100,000 clients receive 1 message per second: Network throughput is (2 x 100,000) = 200,000 bytes = 1,600,000 bits per second (1.526 Mbps)

    相同的每秒客户端轮询的次数,当次数高达10W/s的高频率次数的时候,Polling轮询需要消耗665Mbps,而Websocket仅仅只花费了1.526Mbps,将近435倍!!

    三.谈谈WebSocket协议原理

    Websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。

    Websocket的数据传输是frame形式传输的,比如会将一条消息分为几个frame,按照先后顺序传输出去。这样做会有几个好处:

    1 大数据的传输可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况。
    2 和http的chunk一样,可以边生成数据边传递消息,即提高传输效率。

     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
     +-+-+-+-+-------+-+-------------+-------------------------------+
     |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
     |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
     |N|V|V|V|       |S|             |   (if payload len==126/127)   |
     | |1|2|3|       |K|             |                               |
     +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
     |     Extended payload length continued, if payload len == 127  |
     + - - - - - - - - - - - - - - - +-------------------------------+
     |                               |Masking-key, if MASK set to 1  |
     +-------------------------------+-------------------------------+
     | Masking-key (continued)       |          Payload Data         |
     +-------------------------------- - - - - - - - - - - - - - - - +
     :                     Payload Data continued ...                :
     + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
     |                     Payload Data continued ...                |
     +---------------------------------------------------------------+
    
    
    
        FIN      1bit 表示信息的最后一帧,flag,也就是标记符
        RSV 1-3  1bit each 以后备用的 默认都为 0
        Opcode   4bit 帧类型,稍后细说
        Mask     1bit 掩码,是否加密数据,默认必须置为1 (这里很蛋疼)
        Payload  7bit 数据的长度
        Masking-key      1 or 4 bit 掩码
        Payload data     (x + y) bytes 数据
        Extension data   x bytes  扩展数据
        Application data y bytes  程序数据
    

    具体的规范,还请看官网的RFC 6455文档给出的详细定义。这里还有一个翻译版本

    四.WebSocket 和 Socket的区别与联系

    首先,
    Socket 其实并不是一个协议。它工作在 OSI 模型会话层(第5层),是为了方便大家直接使用更底层协议(一般是 TCPUDP )而存在的一个抽象层。Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API)。


    Socket通常也称作”套接字”,用于描述IP地址和端口,是一个通信链的句柄。网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket,一个Socket由一个IP地址和一个端口号唯一确定。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。

    Socket在通讯过程中,服务端监听某个端口是否有连接请求,客户端向服务端发送连接请求,服务端收到连接请求向客户端发出接收消息,这样一个连接就建立起来了。客户端和服务端也都可以相互发送消息与对方进行通讯,直到双方连接断开。

    所以基于WebSocket和基于Socket都可以开发出IM社交聊天类的app

    五.iOS平台有哪些WebSocket和Socket的开源框架

    Socket开源框架有:CocoaAsyncSocketsocketio/socket.io-client-swift
    WebSocket开源框架有:facebook/SocketRockettidwall/SwiftWebSocket

    六.iOS平台如何实现WebSocket协议

    Talk is cheap。Show me the code ——Linus Torvalds

    我们今天来看看facebook/SocketRocket的实现方法
    首先这是SRWebSocket定义的一些成员变量

    
    @property (nonatomic, weak) id <SRWebSocketDelegate> delegate;
    /**
     A dispatch queue for scheduling the delegate calls. The queue doesn't need be a serial queue.
    
     If `nil` and `delegateOperationQueue` is `nil`, the socket uses main queue for performing all delegate method calls.
     */
    @property (nonatomic, strong) dispatch_queue_t delegateDispatchQueue;
    /**
     An operation queue for scheduling the delegate calls.
    
     If `nil` and `delegateOperationQueue` is `nil`, the socket uses main queue for performing all delegate method calls.
     */
    @property (nonatomic, strong) NSOperationQueue *delegateOperationQueue;
    @property (nonatomic, readonly) SRReadyState readyState;
    @property (nonatomic, readonly, retain) NSURL *url;
    @property (nonatomic, readonly) CFHTTPMessageRef receivedHTTPHeaders;
    // Optional array of cookies (NSHTTPCookie objects) to apply to the connections
    @property (nonatomic, copy) NSArray<NSHTTPCookie *> *requestCookies;
    
    // This returns the negotiated protocol.
    // It will be nil until after the handshake completes.
    @property (nonatomic, readonly, copy) NSString *protocol;
    
    

    下面这些是SRWebSocket的一些方法

    
    // Protocols should be an array of strings that turn into Sec-WebSocket-Protocol.
    - (instancetype)initWithURLRequest:(NSURLRequest *)request;
    - (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray<NSString *> *)protocols;
    - (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray<NSString *> *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates;
    
    // Some helper constructors.
    - (instancetype)initWithURL:(NSURL *)url;
    - (instancetype)initWithURL:(NSURL *)url protocols:(NSArray<NSString *> *)protocols;
    - (instancetype)initWithURL:(NSURL *)url protocols:(NSArray<NSString *> *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates;
    
    // By default, it will schedule itself on +[NSRunLoop SR_networkRunLoop] using defaultModes.
    - (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
    - (void)unscheduleFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
    
    // SRWebSockets are intended for one-time-use only.  Open should be called once and only once.
    - (void)open;
    - (void)close;
    - (void)closeWithCode:(NSInteger)code reason:(NSString *)reason;
    
    ///--------------------------------------
    #pragma mark Send
    ///--------------------------------------
    
    //下面是4个发送的方法
    /**
     Send a UTF-8 string or binary data to the server.
    
     @param message UTF-8 String or Data to send.
    
     @deprecated Please use `sendString:` or `sendData` instead.
     */
    - (void)send:(id)message __attribute__((deprecated("Please use `sendString:` or `sendData` instead.")));
    - (void)sendString:(NSString *)string;
    - (void)sendData:(NSData *)data;
    - (void)sendPing:(NSData *)data;
    
    @end
    

    对应5种状态的代理方法

    ///--------------------------------------
    #pragma mark - SRWebSocketDelegate
    ///--------------------------------------
    @protocol SRWebSocketDelegate <NSObject>
    
    - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;
    
    @optional
    - (void)webSocketDidOpen:(SRWebSocket *)webSocket;
    - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
    - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
    - (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload;
    
    // Return YES to convert messages sent as Text to an NSString. Return NO to skip NSData -> NSString conversion for Text messages. Defaults to YES.
    - (BOOL)webSocketShouldConvertTextFrameToString:(SRWebSocket *)webSocket;
    @end
    

    didReceiveMessage方法是必须实现的,用来接收消息的。
    下面4个did方法分别对应着Open,Fail,Close,ReceivePong不同状态的代理方法

    方法就上面这些了,我们实际来看看代码怎么写

    先是初始化Websocket连接,注意此处ws://或者wss://连接有且最多只能有一个,这个是Websocket协议规定的

        self.ws = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@://%@:%zd/ws", serverProto, serverIP, serverPort]]]];
        self.ws.delegate = delegate;
        [self.ws open];
    

    发送消息

        [self.ws send:message];
    

    接收消息以及其他3个代理方法

    //这个就是接受消息的代理方法了,这里接受服务器返回的数据,方法里面就应该写处理数据,存储数据的方法了。
    - (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message
    {
        NSDictionary *data = [NetworkUtils decodeData:message];
        if (!data)
            return;
    }
    
    //这里是Websocket刚刚Open之后的代理方法。就想微信刚刚连接中,会显示连接中,当连接上了,就不显示连接中了,取消显示连接的方法就应该写在这里面
    - (void)webSocketDidOpen:(SRWebSocket *)webSocket
    {
        // Open = silent ping
        [self.ws receivedPing];
    }
    
    //这是关闭Websocket的代理方法
    - (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean
    {
        [self failedConnection:NSLS(Disconnected)];
    }
    
    //这里是连接Websocket失败的方法,这里面一般都会写重连的方法
    - (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error
    {
        [self failedConnection:NSLS(Disconnected)];
    }
    

    最后

    以上就是我想分享的一些关于Websocket的心得,文中如果有错误的地方,欢迎大家指点!一般没有微信QQ那么大用户量的app,用Websocket应该都可以完成IM社交聊天的任务。当用户达到亿级别,应该还有很多需要优化,优化性能各种的吧。

    最后,微信和QQ的实现方法也许并不是只用Websocket和Socket这么简单,也许是他们自己开发的一套能支持这么大用户,大数据的,各方面也都优化都最优的方法。如果有开发和微信和QQ的大神看到这篇文章,可以留言说说看你们用什么方式实现的,也可以和我们一起分享,我们一起学习!我先谢谢大神们的指点了!

    相关文章

      网友评论

      • de33a557e92d:您好!我想请问下app在进入后台或者把app的进程杀死的时候,还能接收到么?
      • 孤独感爆棚:Websocket实现视频通话,语音通话,有什么好的解决方案吗
        一缕殇流化隐半边冰霜:@孤独感爆棚 这块没有怎么研究:cold_sweat:
      • Coopin:微信开源了一套自己的跨平台终端组件其中就有socket,他们应该用的socket吧,https://github.com/Tencent/mars
      • 兔斯基的生活:请问 “WebSocket诞生由来” 这章节下 关于轮询,长轮询的图片是在哪里找到的呢?
        一缕殇流化隐半边冰霜:@兔斯基的生活 这个。。。时间有点久了。。记不起来了。。。:sob: :sob:
      • 程守斌:"它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。",我看其他的Socket都是通过ip加端口连接,但是客户端写死ip和端口是很不明智的,我们知道通过域名解析在客户端与服务端之间建立桥梁,服务端就能更加灵活,我看WebSocket里能通过url建立连接,你说的http一次握手有可能是用来域名解析用的,我猜的,没深究过
      • f105fd19438c::wink:感谢作者的分享,自己最近根据websocket码了一个即时通迅的雏形,后台用了perfect框架:joy:要不是看到您的文章我还在苦恼服务端怎么写hhhh
        一缕殇流化隐半边冰霜:@Bakakun 加油💪与君共勉
        f105fd19438c:@一缕殇流化隐半边冰霜 :smile: 学生党受宠若惊,努力成为您这样的知识分享者:pray:
        一缕殇流化隐半边冰霜:@Bakakun 厉害厉害~~:+1: :clap: :+1: 能给大神一些灵感,我也非常开心~~
      • HJXu:感觉很不错,先马后看
        一缕殇流化隐半边冰霜:@HJXu 一起学习:kissing_heart:
      • ChardXu:看了您的文章,对Socket有了更深的了解。我们公司最近也在用WebSocket,我也用的是Facebook的SRWebSocket,遇到了两个问题:
        1、websocket可以正常连接,不过连接成功两分钟后就会断掉,后台没有提供心跳接口,像这样的问题应该怎么处理?我目前临时处理是断开后置空websocket,然后重新连接,感觉这样太不好了,而且会有较低概率出现闪退,回复是由于 NSAssert(_readyState == SR_CONNECTING, @"Cannot call -(void)open on SRWebSocket more than once");
        2、断网重连问题:在断网后WebSocket也会断开,然后我用了一个监听网络状态的库,如果网络重新打开了,我会重连,但也会出现 NSAssert(_readyState == SR_CONNECTING, @"Cannot call -(void)open on SRWebSocket more than once");
        3、还有一种情况,如果网络正常,服务器崩了,我应该怎么处理呢?是直接断开,还是定时重连呢?
        项目急着上线,恳请大神看见后尽快回复,感激不尽!
        一缕殇流化隐半边冰霜:@ChardXu 2. WebSocket我记得是有重新连接的机制的,之前是在哪里写的,单独去监听的话,你需要拿到之前那个连接,不然会出现你这个错误。
        一缕殇流化隐半边冰霜:@ChardXu 1.连接几分钟会断掉,是因为你进入后台了还是自动就会断?一般都是需要用心跳来维持的,之前我们是有心跳的。你直接置空确实是有闪退的危险的。
        ChardXu:之前我用的一直是CocoaAsyncSocket,对于这个用的感觉还行,总感觉SRWebSocket还是差点:sob:
      • 水木易安:第四点 WebSocket 和 Socket的区别与联系 写得很模糊
      • Keep_FighterLS:微信不是用的Mars么,已经开源了
        一缕殇流化隐半边冰霜:@Keep_FighterLS 嗯啊。。是的。C++写的网络层
      • 115ccb264d5e:学习了 虽然没有接触即时通讯 支持
        一缕殇流化隐半边冰霜:@怀念战争年代 :kissing_heart: 一起学习
      • georgegrape:有一点不明白,跟服务器建立连接的话,如果我需要给服务器传递参数然后服务端根据参数丢给我数据,这个怎么做?websocket的域名拼接怎么做啊?
        一缕殇流化隐半边冰霜:@georgegrape :sweat: 域名拼接这块是组里另外一个人做的。。。我这块好像也不记得怎么做的了。。。
      • taoza:websocket 我喜欢。
      • snowfox09:谢谢分享!很多时候,一个好东西一定伴随着某些缺点。对于websocket,它的优点你的文章解释得很清楚。但是它的缺点呢?我想其中一个是,因为其连接的persistent特点,必然占据大量的资源(服务器以及客户端),因此对于并发量大的情况下,资源的消耗应该是很可观的。除此之外,不知道还有其他缺点呢?
        一缕殇流化隐半边冰霜:@snowfox09 这个你说的也有道理的,不过我之前公司会觉得这点损耗相对于优点来说,还是可以忽略。最终还是选择了Websocket的方案
      • 韩大熊宝要姓张:感谢分享.加油.
      • 親菿碗哩來:这个库也是各种坑,要自己写WebSocket连接保护!
      • goodthing:标记下做以后学习
      • 仰望星空之Rocky:webSocket 不是用于web端的?本地APP也可以用吗?额,,小白,,O(∩_∩)O谢谢
        一缕殇流化隐半边冰霜:@wwwang 可以呀。。你看我文章里面分析的那几个库,就是iOS上的呀
      • CoderLXWang:切换到后台之后是怎么处理的?
      • 不留名的黄子嘉:web socket 不是基于http的 是在http三次握手后替换协议成为长链接 因为和socket类似 才叫websocket :no_mouth: 微信使用socket+http的。 socket用来传递状态 http用来传递信息。
      • 骑士小子12:webSocket心跳,怎么处理的
        一缕殇流化隐半边冰霜:@骑士小子12 每隔几秒发一次。。和socket差不多
      • 42e1c79aee08:楼主大神请问一下,我手动导入SocketRocket的时候,编译会出错,这是怎么回事呢?
        42e1c79aee08:@一缕殇流化隐半边冰霜 好的吧
        一缕殇流化隐半边冰霜:@赵小三 你把编译错误去Google上搜一下
      • ad0be89dd139:你好,怎么通过websocket同时实现多个长连接????因为连接的地址是不一样的.
        一缕殇流化隐半边冰霜:@jianshuniu 你加了哪个群??
        ad0be89dd139:@一缕殇流化隐半边冰霜 我加了群,你QQ是哪一个??
        一缕殇流化隐半边冰霜:@jianshuniu 多个啊。。要客户端和服务器连多个,是吧??
      • PaulPaulBoBo:学习了,赞
        一缕殇流化隐半边冰霜:@PaulPaulBoBo 一起学习:kissing_heart::kissing_heart::kissing_heart:
      • 64e3fd8110d0:大神
        一缕殇流化隐半边冰霜:@liqg 我还是菜鸟。。。:stuck_out_tongue_winking_eye::stuck_out_tongue_winking_eye:
      • twinkle_孟:很喜欢,谢谢分享
        一缕殇流化隐半边冰霜:@孟凡君 一起学习:kissing_heart:
        twinkle_孟:@一缕殇流化隐半边冰霜 很高兴认识你,你写的每一篇文章对我都很有用,非常感谢
        一缕殇流化隐半边冰霜:@孟凡君 :kissing_heart::kissing_heart::kissing_heart:一起学习
      • 小凉介:我之前公司也是用的websocket,现在公司是用的环信
        一缕殇流化隐半边冰霜:@大神Q 我们用的云信。。之前我做智能家居的时候用的Websocket
      • 泺莫繁华:我现在刚用websocket,但是就是连不上服务器,报的2133,Invalid Sec-WebSocket-Accept response错误,连接用的ws://,求解这是为什么?
        一缕殇流化隐半边冰霜:@泺莫繁华 这个。。感觉是服务器设置有点问题。。不过这个错误我之前也没有遇到过。。iOS这边用那个库设置好连接之后,基本很少出错。。
      • 豆小兽:看看 再看一遍 不太懂~
        豆小兽:@一缕殇流化隐半边冰霜 好的 谢谢
        一缕殇流化隐半边冰霜:@豆小兽 我推荐你看泊学上面的一个视频,讲的是网页版的聊天室,看看,应该有启发!!
      • 4990145ebbf7:支持一个,话说楼主有没有那种小范围的交流群或者讨论组呢?
        4990145ebbf7:@一缕殇流化隐半边冰霜 已申请 :stuck_out_tongue_winking_eye:
        一缕殇流化隐半边冰霜:@夕夏如是说 这是兄弟的一个群,我在里面,你要是不嫌弃就进来吧,群号是554602551,可以一起进来交流学习,群里大神很多的!!要是有验证信息的话,就说是一缕殇流化隐半边冰霜介绍来的。。
      • 买了否冷_:楼主楼主 求一份demo、。 :smiley: 。。。
        一缕殇流化隐半边冰霜:@偷偷学很多东西 这个不好给Demo,只能给个思路,实现牵扯到服务器接口设计,很多问题。我推荐你看看泊学上面的一个视频教程吧。。那个有一个视频教学,讲的类似的
        买了否冷_:@一缕殇流化隐半边冰霜 是啊 就上面讲的这些 我以为最后又demo
        一缕殇流化隐半边冰霜:@偷偷学很多东西 额。。。要websocket的Demo啊??
      • WallisW:先手了
      • DrunkenMouse:如果是个人练习一些即时聊天的功能,要如何写出Demo呢?公司没这需求,但想要提升自己,可是数据传输方面不知道往哪传,也不知道从哪接。导致一直没有机会去实战,唉。。。
        一缕殇流化隐半边冰霜:@DrankMouse 你看看那个教程,写写练练吧:kissing_heart::stuck_out_tongue_winking_eye:
        DrunkenMouse:@一缕殇流化隐半边冰霜 想想也是。。麻烦了~
        一缕殇流化隐半边冰霜:@DrankMouse 这个。。暂时我也不知道怎么练。。泊学上面有一个socket.io的教程,要不你看看,那个是一个网络聊天室。
      • caeb910f2099:干货!!
      • Timi:菜鸟一个
      • Cuffy:mark
      • peerless2012:UDP + 回执,估计是这样。因为有的时候会发生对方其实已经收到了,但是这边提示没有收到
        一缕殇流化隐半边冰霜:@peerless2016 嗯!!是的,回执很重要!
      • d1d29f66124b:websocket
      • 向钱冲啊:满满干货,必须赞!
        向钱冲啊:@一缕殇流化隐半边冰霜 客气了兄弟,看了以后至少对websocket有了一定的认识
        一缕殇流化隐半边冰霜:@向钱冲啊 嘻嘻。。谢谢。。我也还是菜鸟啦。。一起学习,共同进步啦。。
        一缕殇流化隐半边冰霜:@向钱冲啊 谢谢啦。。一起学习。。共同进步:stuck_out_tongue_winking_eye::stuck_out_tongue_winking_eye:
      • 9d788c94b1c1:LZ 我想请问你 那个语法是什么语法 。。。我是菜鸟,,,看不懂,, :disappointed_relieved:
        一缕殇流化隐半边冰霜:@unjack 什么语法??在哪??代码是OC的
      • ad5dd2915c89:http2,也支持长链和服务区推送,有了http2,web socket还有必要吗?
        一缕殇流化隐半边冰霜:@kevinclcn 额。。这个我还没有试过额。。。websocket主要是能减少来来回回请求的消耗。。
      • zyg:Websocket是应用层第七层上的一个应用层协议,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。

        websocket 其实不需要 http 的 依赖http 只是为了兼容浏览器
      • mf168:mark 学习了
        一缕殇流化隐半边冰霜:@QQDAOCOM 哈哈。。我也是菜鸟。。一起学习,一起进步哈!!
        mf168:@一缕殇流化隐半边冰霜 😄 小菜飘过
        一缕殇流化隐半边冰霜:@QQDAOCOM 刚刚推送过来,显示你的名字。。我以为大神来了。。哈哈。。
      • 黑曼巴蜜蜜:好文章赞一个
        一缕殇流化隐半边冰霜:@hiuhiuhiu 谢谢。。一起学习,一起进步
      • 逆袭的小菜鸟:支持,真的不错
        一缕殇流化隐半边冰霜:@逆袭的小菜鸟 嘻嘻。。我也和你一样,都还是菜鸟啦。。一起进步吧。。做个逆袭的小菜鸟:stuck_out_tongue_winking_eye:
      • 86342cd50761:好!下次试试!
      • 童真的烂漫:请问,那些图是在哪看到的?
        童真的烂漫:@一缕殇流化隐半边冰霜 谢谢
        一缕殇流化隐半边冰霜:@童真的烂漫 我在WebSocket那个RFC文档上面看的。
      • 16d9e04ef648:微信web版用的WebRTC,但是客户端是自定义的私有协议
        一缕殇流化隐半边冰霜:@路法师 嗯。。大神说是基于Socket自己开发的一套高性能方案
      • 偌上:微信用的WebRTC。几个G的源码
        34965637fc27:是微信浏览器支持WebRTC吧? 微信内置的视频聊天不是采用的webRTC吧?
        鈊铭:@一缕殇流化隐半边冰霜 webrtc支持音视频方面的东西....普通的im还是需要socket来做.
        一缕殇流化隐半边冰霜:@偌上 是真的么?这个协议我听过,比Websocket更好,还支持视频,语音,都支持!!
      • niuxinghua:qq微信 应该是有自己用c++封装过 给移动平台用的库
        一缕殇流化隐半边冰霜:@niuxinghua 我估计也是,原来QQ开始做的那个时候,基本上只有C/C++写的那种很低层的socket,他们很可能就是基于那个开发的。。
      • a4c988ec2234:谢谢分享
      • 许还真:一种是tcp,一种是udp.做好im不容易。
        一缕殇流化隐半边冰霜:@wng2010 好吧。。我之前做的用户量不够大,而且是注重加密,所以选的TCP。
        橘子香蕉苹果:@一缕殇流化隐半边冰霜 我觉得就是UDP,TCP是不现实的 传递消息比较多的情况下
        一缕殇流化隐半边冰霜:@一朵云风Xuyanci 这句话说到点子上了!确实,微信QQ这种用的说不定是UDP,用户量大了之后确实不好做,我们公司现在用户量还不多。:stuck_out_tongue_winking_eye::stuck_out_tongue_winking_eye:大神你是不是也研发过IM类似的产品?
      • 英贰与我:你又更新文章了,写的真不错,我现在项目中聊天这块儿我们也是用socket实现的,不过对socket里面的细节原理还是没有深度了解,不知你了解这块儿有没有好资料也分享一下呗,我们项目最后用的是socketIO这个开源框架,因为我们有涉及到和网页端通讯,但版本太低,和安卓前端的支持不是很好,后面我估计需要将这块儿改成swift语言的开源框架
        英贰与我:@我旁边坐了一个胖子 环信只能作为前期方案吧,要是后期通讯还是主要功能,我觉得还是自己用socket写一套比较好,尤其是它是你项目的核心功能之一时
        系统盘:聊天不是一般都集成环信么,高集成,简单
        一缕殇流化隐半边冰霜:@ZZ_running 谢谢你的支持。。。我也还是菜鸟啦,也就是分享给大家一些我知道的罢了。我现在目前做的聊天模块也是用Socket做的,我们用的CocoaAsyncSocket这个框架的。我大概看了一下,socketio/socket.io-client-swift这个在github上可以支持好多平台,server,Mac,iOS都有,而且又是OC和Swift版本都有,你看这个行不行。

      本文标题:微信,QQ这类IM app怎么做——谈谈Websocket

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