即时通讯(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 ...
随机推荐
- mac安装Redis可视化工具-Redis Desktop Manager
Redis是一个超精简的基于内存的键值对数据库(key-value),一般对并发有一定要求的应用都用其储存session,乃至整个数据库.不过它公自带一个最小化的命令行式的数据库管理工具,有时侯使用起 ...
- SpringBoot------自定义拦截器
1.添加pom.xml使用的依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt ...
- Dynamic attention in tensorflow
新代码在contrib\seq2seq\python\ops\attention_decoder_fn.py 和之前代码相比 不再采用conv的方式来计算乘,直接使用乘法和linear 给出了两种at ...
- Android的Base64的坑
Base64.encodeToString加密后一直和Apache的对不上,多了换行符,最后使用了NO_WRAP就好了 Base64.encodeToString(src, Base64.URL_SA ...
- MonoDevelop ctrl + ' 不能定位正确的unity文档
Just Do This I had the same problem in MonoDevalop, but the url in it cannot be changed. So I tried ...
- python nose 自写插件支持用例带进度
在自动化测试过程中,当用例很多且要跑很久时,就会出现这样一个问题,不知道当前跑到第几个用例了,还有多少用例要跑,怎么办? 因为用的nose框架,那就看看nose有没有这样的库支持,结果看了一圈,只找到 ...
- Android 7.0 适配
extends:http://www.jianshu.com/p/56b9fb319310http://blog.csdn.net/chay_chan/article/details/57083383
- Kali Linux安装
Kali Linux 安装过程参考:https://blog.csdn.net/qq_40950957/article/details/80468030 安装完成后,apt-get install 安 ...
- postgresql免密码登录
https://www.postgresql.org/docs/8.3/static/libpq-pgpass.html vi ~/.pgpass 输入以下内容 hostname:port:datab ...
- PHP实现今天是星期几
echo "今天是星期" . mb_substr( "日一二三四五六",date("w"),1,"utf-8" );