iOS基于WebSocket的聊天机制

转载 2016年05月31日 17:41:06

iOS基于WebSocket的聊天机制


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一般是配合数据库一起使用的,实现的逻辑要根据具体情况来确定的.

iOS使用webSocket的简单实现

最近做K线图相关的东西,需要和服务器进行长连接实时获取数据,因为后台使用webSocket实现的,经过一番波折最终找到了facebook开源的 SocketRocket 框架,他是用oc封装的webs...
  • studying_ios
  • studying_ios
  • 2017年06月06日 19:41
  • 1820

IOS学习之websocket使用方法

websocket,使用tomcat7转发 前篇:  http://haoningabc.iteye.com/blog/2011985  代码的git地址  https://githu...
  • u010963948
  • u010963948
  • 2016年03月22日 21:17
  • 1115

iOS websocket 及时通讯实现

2015-09-03 by 木易哥哥     开发一个类似QQ、微信的即时IM聊天功能,做到实时监控消息,需要用的技术是websocket,WebSocket protocol 是HTML5一种新的协...
  • manyxh
  • manyxh
  • 2015年09月03日 17:34
  • 19079

iOS之WebSocket(即时通讯、实时接受广播消息)

在项目中使用到了广播消息,例如广播通知 首先导入pod 'SocketRocket', '~> 0.5.0'引入4个库 libicucore.dylib,CFNetwork.framework, ...
  • shengdaVolleyball
  • shengdaVolleyball
  • 2016年07月29日 18:35
  • 1137

ios客户端websocket的helloworld

ios8,xcode6 https://github.com/square/SocketRocket https://github.com/killinux/SocketRocket 中的...
  • rare_ice
  • rare_ice
  • 2016年03月08日 10:45
  • 563

iOS SRWebSocket原理分析及API使用

以前浏览器实现即时通讯是通过轮询(long poll 和 ajax)技术解决,但是有很大的弊端,比如通讯延时、流量浪费等。直到WebSocket出现才有助于解决这一问题。WebSocket proto...
  • SL_ideas
  • SL_ideas
  • 2017年06月22日 15:41
  • 799

iOS 上的 WebSocket 框架 Starscream

原文:WebSockets on iOS with Starscream 作者:Aaron Douglas 译者:kmyhy 传统的网络技术 (也就是 Berkeley sockets) ...
  • kmyhy
  • kmyhy
  • 2017年01月07日 09:05
  • 6093

swift 实现websocket与后台通信(swift 如何构建简单的json字符串)

swift 语言在国内流传度不是很广,初学者者想找相关资料很困难,想去国外找资料又被墙了,本人才疏学浅,记录下一些学习过程中的经验,希望看完对你也有所帮助! 一个应用不可避免要与服务器进行通信,主要有...
  • q849340003
  • q849340003
  • 2015年03月26日 15:55
  • 3416

websocket 利用json 传递多个参数

目前情况是页面加载完后要从后台获取多个信息,而信息是动态的,这要求我们前端也要动态的显示,查了很多资料,利用websocket终于解决了.其实主要注意一点,websocket的参数是以二进制来传递的,...
  • grs294845170
  • grs294845170
  • 2017年08月03日 14:53
  • 3923

iOS Client 与WebSocket 通信 入门demo 即时通讯 socketio

1.首先去node js 官网安装node js环境     安装完成如下:   安装完成 打开终端 输入 : node  -v    log输出:v0.10.13.     这就证明...
  • wanghouqing
  • wanghouqing
  • 2014年04月08日 10:18
  • 1551
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS基于WebSocket的聊天机制
举报原因:
原因补充:

(最多只允许输入30个字)