原文网址: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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

最新文章

  1. spring mvc 深入学习
  2. 后缀数组 POJ 3693 Maximum repetition substring
  3. Access“输入的表达式中含有一个无效日期值”
  4. 学习CSS3BUTTON(二)
  5. IIS网站部署注意点
  6. Javascript与Ajax
  7. 一个cocos2d程序的完整人生(从环境到代码全过程)
  8. Qdocconf 写法
  9. css常用文本属性
  10. jquery中关键字写错导致的错误——dataType写成dateType(data写成date)
  11. 变量类型-Dict
  12. node之jade和ejs的使用方法 jade篇
  13. 【Java并发核心五】Future 和 Callable
  14. eclipse配置tomcat后出现:java virtual machine launcher Error:Could not ……,Program will exit.
  15. Python基础之逻辑运算
  16. 全面了解HTTP请求方法说明
  17. JavaScript 扩展运算符
  18. vue 移动端添加 时间日期选择器
  19. SQL Server ->> 内置标量函数TRY_PARSE、TRY_CAST和TRY_CONVERT的各自特点和区别
  20. Hibernate怎么用

热门文章

  1. iOS中属性Property的常用关键字的使用说明
  2. JavaScript:变量对象(Variable Object)
  3. jQuery 关于 end() 方法的详细解释
  4. new work
  5. The constness of a method should makes sense from outside the object
  6. C++ offsetof
  7. OnePlus安装Kali-NetHunter
  8. HDOJ-三部曲一(搜索、数学)-1005-Dungeon Master
  9. markdown to html
  10. Web 仪表盘