之前公司的即时聊天用的是常轮循,一直都觉得很不科学,最近后台说配置好了socket服务器,我高兴地准备用asyncsocket,但是告诉我要用websocket,基于HTML5的,HTML5中提出了一种新的双向通信协议--WebSocket,本文尝试采用这种技术来实现以上的实时聊天功能。

在搜索了很多资料后,用square大神的SocketRocket进行实现,会比较简单,同时URL和端口,发送消息参数需要和后台约定好。

首先pod导入SocketRocket

platform :ios, '7.0'
pod 'SocketRocket', '~> 0.5.0'

然后在搭建一个最简单的页面,只有一个输入框和button

在控制器中导入头文件

#import <SocketRocket/SRWebSocket.h>

创建

SRWebSocket *webSocket;

简单点,在viewDidLoad中实例化并且设置代理,链接URL和规定端口号,

webSocket.delegate = nil;

[webSocket close];

webSocket = [[SRWebSocket alloc] initWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"你的服务器URL和端口号"]]];

webSocket.delegate = self;

NSLog(@"Opening Connection...");

[webSocket open];

记得要遵守协议<SRWebSocketDelegate>,实现delegate方法

#pragma mark - SRWebSocketDelegate

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

NSLog(@"Websocket Connected");

NSError *error;

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:@{@"id":@"chat",@"clientid":@"hxz",@"to":@""} options:NSJSONWritingPrettyPrinted error:&error];

NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

[webSocket send:jsonString];

}

- (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);

}

- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;{

NSLog(@"WebSocket closed");

webSocket = nil;

}

- (IBAction)sendMessage:(id)sender {

NSError *error;

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:@{@"id":@"chat",@"clientid":@"hxz",@"to":@"mary",@"msg":@{@"type":@"0",@"content":self.textfield.text}} options:NSJSONWritingPrettyPrinted error:&error];

NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

[webSocket send:jsonString];

}

其中webSocketDidOpen是在链接服务器成功后回调的方法,在这里发送一次消息,把id 名字发送到服务器,告知服务器,

在send方法中有两个选择:

// Send a UTF8 String or Data.

- (void)send:(id)data;

// Send Data (can be nil) in a ping message.

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

第一个是需要发送JSON字符串格式的Data,必须把对象转换成JSON字符串格式,否则报错,第二种是发送NSData类型,而且根据注释可以为nil

在文本框输入消息,发送后在对方消息列表显示成功:

对方发送消息给我这端时,didReceiveMessage方法接受到消息后会执行,输出消息内容:

完成~

最新文章

  1. 原创 C++应用程序在Windows下的编译、链接:第三部分 静态链接(二)
  2. gkENGINE重开!
  3. git学习(一):建立本地仓库和基本命令
  4. 编译MVC解决方案老出现这个问题的原因
  5. store 加载异常处理与加载信息提示
  6. Oracle--存储过程学习进阶
  7. 单个input框上传多个文件操作
  8. sizeWithFont 不是线程安全。
  9. Java中final变量的初始化方式
  10. 原生 JavaScript 图片裁剪效果
  11. mysql 源码编绎修改 FLAGS,调试MYSQL
  12. DevExpress Report的简单应用
  13. 老李分享:Robotium编写测试用例如何模拟Junit4的BeforeClass和AfterClass方法1 - 条件判断法
  14. SpringBoot单元测试中的事务和Session
  15. L3-002 特殊堆栈 (30 分) 模拟stl
  16. ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression笔记
  17. ELK 5.6.8 安装部署
  18. CocosCreator 场景转换API
  19. http 请求头大小写的问题
  20. 29.如何不用 transition 和 animation 也能做网页动画

热门文章

  1. Redis安装以及基本操作命令
  2. QFileInfo与QFileIconProvider(分别用于获取文件信息和获取文件的图标)
  3. Json解析方式
  4. 常用调试工具gdb,dbx,valgrind介绍一
  5. BZOJ5324 JXOI2018 守卫
  6. CH5103 [NOIP2008]传纸条[线性DP]
  7. vue 常见的新增、编辑、查看公用同一个页面
  8. 设计模式-利用职责链模式消除if
  9. 【转】 Pro Android学习笔记(三七):Fragment(2):基础小例子
  10. 3 K8s安裝ELK+filebeat