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

相关文章推荐

SOAP web service用AFNetWorking实现请求

问: This is my current call to (asmx) SOAP web service: NSString *soapMessage = [NSString string...

iOS 上的 WebSocket 框架 Starscream

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

用 JSQMessagesViewController 创建一个 iOS 聊天 App - 第 1 部分

原文链接 : Create an iOS Chat App using JSQMessagesViewController – Part 1 原文作者 : Mariusz Wisniewski ...
  • kmyhy
  • kmyhy
  • 2016-03-01 16:58
  • 4091

Websocket for Objective-C

1、HTTP协议对长连接的支持以及各浏览器的支持情况 http://blog.csdn.net/fenglibing/article/details/7100222 2、WEB客户...

如何截取UIImage指定大小区域

如何截取UIImage指定大小区域 有时候客户端会遇到这样的需求:从服务器获取到一张图片,只需要显示左半部分,或者中间部分等等。也就是截取UIImage指定大小区域。 //剪裁图片 -(UIIm...

ios截取屏幕指定位置指定大小的实现

这两天开发中需要截取屏幕中指定位置的图片,
  • rgxgf
  • rgxgf
  • 2014-08-29 09:58
  • 1561

ios开发中常用的截取指定区域的视图转换成图片

-(void)fullScreenshots{ UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow]; ...

iOS AFN 做缓存(如何简单的做缓存)

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...

iOS多线程的初步研究(一)-- NSThread

原文地址  http://www.cnblogs.com/sunfrog/p/3243230.html iOS多线程的初步研究(一)-- NSThread 对于多线程的开发...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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