即时通讯(III)
即时通讯的开源库

目前及时通讯可以使用环信、柔云、腾讯云,这些都是基于TCP连接的,UI也是高度定制的,而且它们的技术也是比较成熟的。
XMPP比较早,是开源的,但是坑也比较多。传输的数据是XML,造成了很多流量的雍余。
数据格式

Socket通讯报文是没有结束标识的,通讯报文保留前8个字节的,给我们字节扩展用的。可以利用这前八个字节做些事情。比如:
我们传一个图片,首先要知道它怎么结束,可以给他一个结束标识,如,“/n/n”。第一个4字节我们可以把图片的总长度传过去,根据这个长度判断ImageDate是否传完。第二个字节可以传它的数据格式,定义为content,用来告诉客户端和服务器端传的是什么。然后再拼接为ImageData,并传送到Action。
代码Demo
#import "ViewController.h"
#import "GCDAsyncSocket.h" static NSString *server_host = @"127.0.0.1";
static const short server_port = ; #define VA_Commadn_id 0x00000001 @interface ViewController ()<GCDAsyncSocketDelegate> @property (strong, nonatomic) GCDAsyncSocket *clientSocket;
@property (weak, nonatomic) IBOutlet UITextField *textField; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self initGCDAsyncSocket];
} - (void)initGCDAsyncSocket{
//创建 Socket
if (_clientSocket == nil) {
_clientSocket = [[GCDAsyncSocket alloc] initWithDelegate:self
delegateQueue:dispatch_get_main_queue()];
}
} - (BOOL)connect{
NSError *error = nil;
BOOL connectFlag = [_clientSocket connectToHost:server_host onPort:server_port error:&error];
if (error) {
NSLog(@"%@",error);
}
return connectFlag;
} - (void)disConnect{
[_clientSocket disconnect];
} #pragma mark -- GCDAsyncSocketDelegate
//连接成功回调
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port{
NSLog(@"连接成功"); [_clientSocket readDataWithTimeout:- tag:];
} //断开连接
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err{
NSLog(@"断开连接%@",err.localizedDescription);
} //接受消息
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
NSLog(@"接受到消息");
[_clientSocket readDataWithTimeout:- tag:];
} - (void)sendImage{
//图片数据
UIImage *img = [UIImage imageNamed:@"icon_socket"];
NSData *imgData = UIImagePNGRepresentation(img); NSMutableData *totalData = [NSMutableData data]; //0~3 总长度,前四个字节的总长度 unsigned int totalSize = (int)imgData.length + + ; NSData *totalSizeData = [NSData dataWithBytes:&totalSize length:];
//数据拼接
[totalData appendData:totalSizeData]; // 拼接标识
unsigned int commandId = VA_Commadn_id; NSData *commandIdData = [NSData dataWithBytes:&commandId length:]; [totalData appendData:commandIdData]; //拼接图片数据
[totalData appendData:imgData]; //发送数据
[_clientSocket writeData:totalData withTimeout:- tag:]; } #pragma mark -- Button Action - (IBAction)connectAction:(UIButton *)sender{
[self connect];
} - (IBAction)disConnectAction:(UIButton *)sender{
[self disConnect];
} - (IBAction)sendAction:(UIButton *)sender{
NSData *data = [_textField.text dataUsingEncoding:NSUTF8StringEncoding]; [_clientSocket writeData:data withTimeout:- tag:];
} - (IBAction)sendImageAction:(id)sender {
[self sendImage];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
使用的第三方库的Podfile:
platform:ios, '9.0' target "002--AsyncSocket" do
pod 'CocoaAsyncSocket'
end
及时通讯绘制图片
即时通讯通过画板来绘图可以将绘制贝塞尔尔曲线的CGPoint点放入一个数组,但是CGPoint点是不能传递过去的,会崩溃的。可以将CGPoint点转化为字典,再传递过去。
心跳机制
简介:
在使用TCP长连接的IM服务设计中,往往都会涉及到心跳。心跳一般是指客户端每隔一定时间向服务端发送自定义指令,以判断双方是否存活,因其按照一定间隔发送,类似于心跳,故称为心跳指令。
003--WebSocket 即时通讯机制 代码片段
- (void)initHeart{
//keepAlive 保证连接存在, 真正可用的 心跳机制验证连接双方是否可用
//心跳包 ------ > 连接双方不可用,主动断开连接
//服务端也是会有,心跳包,主动断开连接
//设置超时间 3分钟(心跳设置3分钟):是因为NAT(与外网和内网有关)的失效时间是3分钟
__weak typeof(self) weakSelf = self;
_heatBeat = [NSTimer scheduledTimerWithTimeInterval:* repeats:YES block:^(NSTimer * _Nonnull timer) {
//具体发送根据实际情况
[weakSelf.socket send:@"heart"];
}];
[[NSRunLoop currentRunLoop] addTimer:_heatBeat forMode:NSRunLoopCommonModes];
}
Ping-Pong 机制
发送消息时会判断连接是否存在。如:
A设备给B设备发送消息,A设备上线他会告诉B设备A设备上线了,会得到服务器的反馈,知道A设备上线了。A设备把数据包丢给B设备,B设备会检测A设备是否在线,如果在线,他会通过A和B之间建的Socket连接发送消息,若B不在线,会走苹果的APNS通道。
WebSocket协议(数据帧格式)

即时通讯(III)的更多相关文章
- 利用WCF双工模式实现即时通讯
概述 WCF陆陆续续也用过多次,但每次都是浅尝辄止,以将够解决问题为王道,这几天稍闲,特寻了些资料看,昨晚尝试使用WCF的双工模式实现了一个简单的即时通讯程序,通过服务端转发实现客户端之间的通讯.这只 ...
- android环境下的即时通讯
首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送 ...
- 【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南
申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 G ...
- 【原创】轻量级移动设备即时通讯技术MobileIMSDK的常见问题解答
申明:MobileIMSDK 目前为个人原创开源工程且已发布,现整理了一些有关MobileIMSDK的常见的问题,希望对需要的人有用,谢谢.如需与作者交流,见文章底部个人签名处,互相学习. Mobil ...
- 【原创】轻量级移动端即时通讯技术 MobileIMSDK 发布了
申明:MobileIMSDK目前为个人原创开源工程,投入了大量的时间和精力,希望对需要的人有所帮助.如需与作者交流,见文章底部个人签名处,互相学习.Q群:215891622,欢迎共同志趣者学习和交流. ...
- ActiveMQ 即时通讯服务 浅析
一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provi ...
- APP邂逅即时通讯云,让你的手机APP聊起来
#推荐活动# #线下沙龙# 明天下午在IC咖啡 —— <APP邂逅即时通讯云,让你的手机APP聊起来>, http://url.cn/Y8sYo5
- 岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯
岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯 看过了QQ和360斗争的开端高潮,当然现在还不能说这场斗争已经结束,在我看来这次的事件未尝不是一个适 ...
- Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE
1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...
随机推荐
- VS IISExpress REST DELETE 405 Method Not Allowed
[参考].net IIS MVC Rest api 跨域 PUT DELETE 404 无法使用问题解决方案 今日在使用泛型處理常式處理檔案上傳時,使用了 HTTP 動詞的 PUT.DELETE 進行 ...
- Mysql推荐使用规范(转)
一:基础规范 1.使用InnoDB存储引擎 支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 2.推荐使用utf8mb4字符集 无需转码,无乱码风险, 支持emoji表情以及部 ...
- array_walk 与 array_map的 区别
1.array_walk是用于用户自定义的函数,所以想用array_walk($aIds, "trim");去掉数据元素中的空格是达不到目的的只能用array_walk($aIds ...
- deep learning 以及deep learning 常用模型和方法
首先为什么会有Deep learning,我们得到一个结论就是Deep learning需要多层来获得更抽象的特征表达. 1.Deep learning与Neural Network 深度学习是机器学 ...
- Spring data Jpa,Mybatis,读写锁,@Lock 使用
Spring data jpa 支持注解式的读写锁(悲观锁),实际上这个东西硬编码也简单,但是基于Jpa 命名方式定义的Sql,只能用注解添加支持读写锁了, 不了解读写锁的可以点这里 mysql读写锁 ...
- CSS设置浏览器滚动条样式
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 5px; height: 110px; background-color: #F5 ...
- python将字符串类型改成日期类型
将字符串类型的'2019-03-14'改成date类型,如下: import datetime b = datetime.date(*map(int,'2019-03-14'.split('-'))) ...
- filter的知识点 和 实例
一.过滤器Filter 1.filter的简介 filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目 标资源访问前后进行逻辑处理 2.快速入门 步骤: 1)编写一个 ...
- phpstorm 找到文件修改历史
对着需要查看修改历史的文件右单击:
- Moving Tables---(贪心)
Problem Description The famous ACM (Advanced Computer Maker) Company has rented a floor of a buildin ...