微信,QQ这类IMapp怎么做——谈谈WebsocketFMDN

关于我和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.社交聊天

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阶段

2.改进版的长轮询Longpolling阶段

3.WebSocket诞生

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

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

上图中,我们先看蓝色的柱状图,是Polling轮询消耗的流量,

UsecaseA:1,000clientspollingeverysecond:Networkthroughputis(871x1,000)=871,000bytes=6,968,000bitspersecond(6.6Mbps)

UsecaseB:10,000clientspollingeverysecond:Networkthroughputis(871x10,000)=8,710,000bytes=69,680,000bitspersecond(66Mbps)

UsecaseC:100,000clientspollingevery1second:Networkthroughputis(871x100,000)=87,100,000bytes=696,800,000bitspersecond(665Mbps)

而Websocket的Frame是justtwobytesofoverheadinsteadof871,仅仅用2个字节就代替了轮询的871字节!

UsecaseA:1,000clientsreceive1messagepersecond:Networkthroughputis(2x1,000)=2,000bytes=16,000bitspersecond(0.015Mbps)

UsecaseB:10,000clientsreceive1messagepersecond:Networkthroughputis(2x10,000)=20,000bytes=160,000bitspersecond(0.153Mbps)

UsecaseC:100,000clientsreceive1messagepersecond:Networkthroughputis(2x100,000)=200,000bytes=1,600,000bitspersecond(1.526Mbps)

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

三.谈谈WebSocket协议原理

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

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

1大数据的传输可以分片传输,不用考虑到数据大小导致的长度标志位不足够的情况。

四.WebSocket和Socket的区别与联系

首先,

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

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

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

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

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

Socket开源框架有:CocoaAsyncSocket,socketio/socket.io-client-swift

WebSocket开源框架有:facebook/SocketRocket,tidwall/SwiftWebSocket

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

Talkischeap。Showmethecode——LinusTorvalds

我们今天来看看facebook/SocketRocket的实现方法

首先这是SRWebSocket定义的一些成员变量

@property(nonatomic,weak)iddelegate;

/**

Adispatchqueueforschedulingthedelegatecalls.Thequeuedoesn'tneedbeaserialqueue.

If`nil`and`delegateOperationQueue`is`nil`,thesocketusesmainqueueforperformingalldelegatemethodcalls.

*/

@property(nonatomic,strong)dispatch_queue_tdelegateDispatchQueue;

Anoperationqueueforschedulingthedelegatecalls.

@property(nonatomic,strong)NSOperationQueue*delegateOperationQueue;

@property(nonatomic,readonly)SRReadyStatereadyState;

@property(nonatomic,readonly,retain)NSURL*url;

@property(nonatomic,readonly)CFHTTPMessageRefreceivedHTTPHeaders;

//Optionalarrayofcookies(NSHTTPCookieobjects)toapplytotheconnections

@property(nonatomic,copy)NSArray*requestCookies;

//Thisreturnsthenegotiatedprotocol.

//Itwillbeniluntilafterthehandshakecompletes.

@property(nonatomic,readonly,copy)NSString*protocol;

下面这些是SRWebSocket的一些方法

//ProtocolsshouldbeanarrayofstringsthatturnintoSec-WebSocket-Protocol.

-(instancetype)initWithURLRequest:(NSURLRequest*)request;

-(instancetype)initWithURLRequest:(NSURLRequest*)requestprotocols:(NSArray*)protocols;

-(instancetype)initWithURLRequest:(NSURLRequest*)requestprotocols:(NSArray*)protocolsallowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates;

//Somehelperconstructors.

-(instancetype)initWithURL:(NSURL*)url;

-(instancetype)initWithURL:(NSURL*)urlprotocols:(NSArray*)protocols;

-(instancetype)initWithURL:(NSURL*)urlprotocols:(NSArray*)protocolsallowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates;

//Bydefault,itwillscheduleitselfon+[NSRunLoopSR_networkRunLoop]usingdefaultModes.

-(void)scheduleInRunLoop:(NSRunLoop*)aRunLoopforMode:(NSString*)mode;

-(void)unscheduleFromRunLoop:(NSRunLoop*)aRunLoopforMode:(NSString*)mode;

//SRWebSocketsareintendedforone-time-useonly.Openshouldbecalledonceandonlyonce.

-(void)open;

-(void)close;

-(void)closeWithCode:(NSInteger)codereason:(NSString*)reason;

///--------------------------------------

#pragmamarkSend

//下面是4个发送的方法

SendaUTF-8stringorbinarydatatotheserver.

@parammessageUTF-8StringorDatatosend.

@deprecatedPleaseuse`sendString:`or`sendData`instead.

-(void)send:(id)message__attribute__((deprecated("Pleaseuse`sendString:`or`sendData`instead.")));

-(void)sendString:(NSString*)string;

-(void)sendData:(NSData*)data;

-(void)sendPing:(NSData*)data;

@end

对应5种状态的代理方法

#pragmamark-SRWebSocketDelegate

@protocolSRWebSocketDelegate

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

@optional

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

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

-(void)webSocket:(SRWebSocket*)webSocketdidCloseWithCode:(NSInteger)codereason:(NSString*)reasonwasClean:(BOOL)wasClean;

-(void)webSocket:(SRWebSocket*)webSocketdidReceivePong:(NSData*)pongPayload;

//ReturnYEStoconvertmessagessentasTexttoanNSString.ReturnNOtoskipNSData->NSStringconversionforTextmessages.DefaultstoYES.

-(BOOL)webSocketShouldConvertTextFrameToString:(SRWebSocket*)webSocket;

didReceiveMessage方法是必须实现的,用来接收消息的。

下面4个did方法分别对应着Open,Fail,Close,ReceivePong不同状态的代理方法

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

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

self.ws=[[SRWebSocketalloc]initWithURLRequest:[NSURLRequestrequestWithURL:[NSURLURLWithString:[NSStringstringWithFormat:@"%@://%@:%zd/ws",serverProto,serverIP,serverPort]]]];

self.ws.delegate=delegate;

[self.wsopen];

发送消息

[self.wssend:message];

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

//这个就是接受消息的代理方法了,这里接受服务器返回的数据,方法里面就应该写处理数据,存储数据的方法了。

-(void)webSocket:(SRWebSocket*)webSocketdidReceiveMessage:(id)message

{

NSDictionary*data=[NetworkUtilsdecodeData:message];

if(!data)

return;

}

-(void)webSocketDidOpen:(SRWebSocket*)webSocket

//Open=silentping

[self.wsreceivedPing];

//这是关闭Websocket的代理方法

-(void)webSocket:(SRWebSocket*)webSocketdidCloseWithCode:(NSInteger)codereason:(NSString*)reasonwasClean:(BOOL)wasClean

[selffailedConnection:NSLS(Disconnected)];

//这里是连接Websocket失败的方法,这里面一般都会写重连的方法

-(void)webSocket:(SRWebSocket*)webSocketdidFailWithError:(NSError*)error

THE END
1.十大社交软件排行榜正规社交平台有哪些2024年社交软件十大品牌最新发布,社交软件排行榜前十名品牌有微信、抖音、QQ、微博、快手、哔哩哔哩、小红书、知乎、豆瓣、百度贴吧。社交软件10大品牌排行榜由品牌研究部门收集整理大数据分析、研究得出,帮助你了解社交软件哪个牌子好。https://www.maigoo.com/maigoo/1211sjmt_index.html
2.2024年十大社交平台排行榜社交软件有哪些平台十大品牌网CNPP重磅推出2024社交平台十大品牌排行榜,社交平台品牌排行榜前十名有微信、抖音、腾讯QQ、微博、快手、哔哩哔哩、小红书、知乎、豆瓣、百度贴吧。十大社交平台品牌由品牌数据部门通过收集整理大数据分析研究得出,旨在告诉消费者社交平台什么牌子好。https://www.cnpp.cn/china/list_4509.html
3.社交排行榜前十名APP推荐社交排行榜前十名下载豌豆荚社交排行榜前十名榜单为您提供最新社交排行榜前十名大全,这里不仅有社交排行榜前十名安卓版本APP、历史版本应用下载资源,还有类似社交排行榜前十名的应用推荐,欢迎大家前来豌豆荚下载。https://www.wandoujia.com/bangdan/405058/
4.比较开放的免费社交软件有哪些?如何选择适合自己的社交平台?在如今互联网社交越来越普及的时代,许多人都会选择通过各种社交软件与朋友、家人、同事以及陌生人建立联系。这些社交软件不仅能让我们保持沟通,还提供了广泛的社交功能,帮助我们在虚拟世界里找到自己的社交圈。而在各种社交软件中,哪些是比较开放的免费社交软件呢?本文将带你了解一些适合广泛社交且不收费的社交平台,它们可http://www.panding.net/zdyxajda/418142.html
5.社交应用品牌排行榜前十名社交应用十大品牌排行榜中国品牌网旗下社交应用十大品牌排行榜页面为您推荐十大社交应用品牌榜单,经过统计有10家品牌成功入选社交应用十大品牌排行榜。排名前十名分别是:腾讯QQ、微信、微博、抖音短视频、知乎、百度贴吧、douban豆瓣、陌陌、探探、YY语音https://www.chinapp.com/brand/1955
6.免费高清在线观看人数最多的平台有哪些对于那些想要在线观看免费视频内容的人来说,选择合适的平台非常重要。大型视频平台如优酷、爱奇艺、腾讯视频等都提供了丰富的免费内容,且有着较高的用户观看人数。同时,通过社交平台的推荐,观众还能够发现更多的小众视频资源。无论是在选择平台还是寻找资源时,用户的观看体验始终是最重要的因素。http://www.zjyhpmgs.com/yhsygl/2595694297.html
7.线上直播平台有哪些内容和模块?3、私信和社交分享:平台通常提供私信功能,使观众能够与创作者直接交流。同时,观众可以分享直播内容到其他社交媒体平台,扩大影响力。 三、教育和培训模块 线上直播平台不仅仅是娱乐的场所,还提供了丰富的教育和培训机会: 1、在线课程和讲座:教育者和专业人士可以利用平台传授知识和技能,为学习者提供在线课程和讲座。 https://m.polyv.net/news/32848.html
8.发短信的软件有哪些?手机短信软件下载安装想了解发短信的软件有哪些吗?短信平台软件哪个好?下面小编收集了最新的手机短信软件,使用这些app发送短信完全可以达到和之前使用电话卡发送短信一样的作用,只要是在有网络的情况下,就能够轻松发送短信,既省钱又方便,一定要下载试试哦! 更新:2024-12-12 09:42:19共有23款https://www.32r.com/zt/dxrj/
9.《码码通》可以用于哪些在线社交平台支付?总结,《码码通》作为一款专门为在线社交平台设计的支付工具,具有便捷性、安全性和适用范围广等优势,满足了社交平台用户的需求。在未来,我们期待《码码通》能够不断创新和完善产品功能,为用户带来更多便利和价值。 《码码通》可以用于哪些在线社交平台支付?的介绍就聊到这里吧,感谢你花时间阅读本站内容,有关于其它相https://www.sousou.com/bk/411252.html
10.在线交友软件哪个好在线交友软件都有哪些在线交友平台 在线交友软件合集是可以帮助用户快速的进行脱单的优质软件,在这里所有的用户都可以更好的获得全网最佳的各种优质交友免费资源,并且软件中还有更多的全新交友免费资源可以选择,让你可以轻易获得全网最好的各种交友福利资源,对各种全新交友感兴趣的用户不要错过哦。 https://www.7k7k7.com.cn/hj/zxjypt.html
11.车贩子如何寻找车源?寻找车源有哪些有效途径和策略?寻找车源有哪些有效途径和策略? 在汽车交易行业中,车贩子寻找车源的能力直接关系到其业务的成败。以下是一些有效的途径和策略,帮助车贩子高效地寻找到合适的车源。 1. 利用在线平台和社交媒体 随着互联网技术的发展,许多在线平台和社交媒体成为了车贩子寻找车源的重要工具。例如,通过汽车交易网站、论坛和社交媒体群组https://auto.hexun.com/2024-08-20/214074192.html
12.沃尔玛购物卡在线回收平台有哪些?哪个最靠谱?凤凰网山东沃尔玛购物卡作为一种普遍被接受的礼品卡,因其可转让性和灵活性受到了广泛青睐。然而,随着消费习惯的变化,很多消费者可能会遇到余额剩余或不想再使用的情况。在这种情况下,选择一个可靠的回收平台来处理闲置的沃尔玛购物卡就显得尤为重要。那么,沃尔玛购物卡在线回收平台有哪些?哪个靠谱?本文将详细解答这两个问题。 https://sd.ifeng.com/c/8f5dSP8b0td
13.线上获客平台有哪些?线上获客渠道线上获客平台有哪些?-线上获客渠道-tpshop电商系统 随着科技的不断发展和互联网的普及,线上获客渠道越来越多,许多企业开始把营销活动放在了数字化平台上。这里就为大家介绍几种常见的线上获客平台。 1. 谷歌广告(Google Ads) 谷歌广告是一种广受欢迎的在线广告平台,可帮助企业在谷歌搜索结果中展示他们的广告。它https://m.tp-shop.cn/news_7937
14.免费表情包制作网站有哪些?在线表情包生成平台推荐免费表情包制作网站有哪些?在线表情包生成平台推荐 在如今的即时通讯和社交媒体时代,表情包已经成为了人们日常生活沟通中必不可少的一部分。简单的文字往往无法完全表达我们的情感和意图,而表情包则可以用一张图表达千言万语。因此,制作个性化的表情包已成为越来越多人的需求。本文将为大家介绍几个免费表情包制作网站,https://www.chuangkit.com/blog/pingmiansheji649.html
15.抖音短视频的合作方式,推广渠道有哪些?玩自媒体的人对于新榜应该不陌生,新榜推出了抖音通告模块,粉丝过万的达人们,可以在这个平台对接商家,达成合作。 推广渠道有哪些? 1.在线视频渠道 在线视频渠道如我们常用的影视剧播放软件,爱奇艺、腾讯等。在这些平台插入视频广告对于广告创意性要求较高,且对企业门槛也有一定要求,但是流量获取效果好。 https://www.maijia.com/article/526585
16.有时称为社交网络站点())是一种在线社交媒体平台,人们可以通过它来社交网络服务()或SNS(有时称为社交网络站点())是一种在线社交媒体平台,人们可以通过它来建立与其他人分享类似个人或职业内容、兴趣、活动、背景或现实生活联系的社交网络或社交关系。大多数社交网络都提供多种让用户互动的方式,如聊天、发邮件、影音、檔案分享、網誌、新闻组等。 https://blog.csdn.net/weixin_40191861/article/details/134100172
17.软文发布新闻发布推广平台代写文章网络广告营销媒介星-专业的软文发布平台,汇集全国几千家媒体,专业软文发布,新闻发布,软文推广,微商推广,门户网站发布,提供高效的服务,客户自助发稿。http://www.2016ruanwen.com/
18.媒体报道你都有哪些海淘的经验呢?海淘的过程中是不是也踩过坑趟过雷?国内好用的海淘平台究竟有哪些? 查看详情 撕下海淘标签,五五科技“问路”效果营销能否杀出血路 媒体报道 2022.9.9 今年2月,五五海淘(上海)科技股份有限公司发布公告,因公司业务发展需要,变更证券简称,由“五五海淘”变更为“五五科技”,证券代码保持不https://www.55haitao.com/aboutus/newsmedia.html
19.“线上销售”红利期来临:有赞为您打造专业社交化电商平台界面新闻有赞拥有一整套完整的移动电商解决方案,帮助商家们提供基于移动端开展营销所需的工具。有赞面向线下实体店和线上传统电商,通过自建商城,提供客户粉丝经营、在线互动营销、商品销售、线上线下打通、开放数据等体系化服务。 摆脱传统电商平台,有赞打造社交电商品牌 https://www.jiemian.com/article/4211755_qq.html
20.AppStore上的“小西米语音—在线连麦社交平台”亲,请问是在使用上有什么问题吗?可以通过APP站内联系在线客服反馈哦。(人工在线时间:10:00-23:00) 1.4219731.76379-7913794,2023/09/10 该平台在2023年9月上新的活动中虚假显示活动 我玩这个平台四五个月了,我觉得正常用户在发现平台有问题的情况下可以进行反馈并进行奖励或官方公告解释。但是我再发现问题后已联https://apps.apple.com/cn/app/id1539556919