即时通讯的开源库

目前及时通讯可以使用环信、柔云、腾讯云,这些都是基于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)的更多相关文章

  1. 利用WCF双工模式实现即时通讯

    概述 WCF陆陆续续也用过多次,但每次都是浅尝辄止,以将够解决问题为王道,这几天稍闲,特寻了些资料看,昨晚尝试使用WCF的双工模式实现了一个简单的即时通讯程序,通过服务端转发实现客户端之间的通讯.这只 ...

  2. android环境下的即时通讯

    首先了解一下即时通信的概念.通过消息通道 传输消息对象,一个账号发往另外一账号,只要账号在线,可以即时获取到消息,这就是最简单的即使通讯.消息通道可由TCP/IP UDP实现.通俗讲就是把一个人要发送 ...

  3. 【原创】轻量级即时通讯技术MobileIMSDK:Android客户端开发指南

    申明:MobileIMSDK 目前为个人维护的原创开源工程,现陆续整理了一些资料,希望对需要的人有用.如需与作者交流,见文章底签名处,互相学习. MobileIMSDK开源工程的代码托管地址请进入 G ...

  4. 【原创】轻量级移动设备即时通讯技术MobileIMSDK的常见问题解答

    申明:MobileIMSDK 目前为个人原创开源工程且已发布,现整理了一些有关MobileIMSDK的常见的问题,希望对需要的人有用,谢谢.如需与作者交流,见文章底部个人签名处,互相学习. Mobil ...

  5. 【原创】轻量级移动端即时通讯技术 MobileIMSDK 发布了

    申明:MobileIMSDK目前为个人原创开源工程,投入了大量的时间和精力,希望对需要的人有所帮助.如需与作者交流,见文章底部个人签名处,互相学习.Q群:215891622,欢迎共同志趣者学习和交流. ...

  6. ActiveMQ 即时通讯服务 浅析

      一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provi ...

  7. APP邂逅即时通讯云,让你的手机APP聊起来

     #推荐活动# #线下沙龙# 明天下午在IC咖啡 —— <APP邂逅即时通讯云,让你的手机APP聊起来>, http://url.cn/Y8sYo5 

  8. 岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯

    岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯 看过了QQ和360斗争的开端高潮,当然现在还不能说这场斗争已经结束,在我看来这次的事件未尝不是一个适 ...

  9. Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE

    1. 前言 Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Serve ...

随机推荐

  1. 安装 VMWare ESXi 6.7:VMB: 548: Unsupported CPU:6.7版本的ESXi 不支持 某些cpu了

    如题,谨记! 升级是双面刃! 用6.5--版本,即可.

  2. 21备忘录模式Memento

    一.什么是备忘录模式 Memento模式也叫备忘录模式,是行为模式之 一,它的作用是保存对象的内部状态,并在需要 的时候(undo/rollback)恢复对象以前的状态. 二.备忘录模式的应用场景 如 ...

  3. javascript变量作用域 全局及局部

    $("#inStartTime").datetimepicker({ format: 'yyyy-mm-dd hh:ii', autoclose: true, todayBtn: ...

  4. 扫描系统进程和获取某进程的PID

    扫描系统的所有进程 #include <stdio.h> #include <windows.h> #include <tlhelp32.h> int scan() ...

  5. Angel - 模拟Kafka数据流调试FTRL的方法

    Angel - 模拟Kafka数据流调试FTRL的方法 Mac或者Linux版本(Win10的Linux子系统同样适用) 创建一个目录用来安装kafka以及zookeeper等相关软件,比如,新建一个 ...

  6. Python学习之旅(九)

    Python基础知识(8):集合 集合:由不同元素组成,无序的,不重复的序列 补充知识:可变类型:列表.字典:不可变类型:数字.字符串.元组 使用大括号{}或set()方法定义集合 se=set(&q ...

  7. 原生JS表格行拖动排序,添加了回调功能

    function tableDnD(el, callback) { if (typeof (el) == "string") { el = document.getElementB ...

  8. python的基础1

    1.换行需要多个引号,'''''' """"""Eg:print('''文能提笔安天下,# 武能上马定乾坤.# 心存谋略和人生,# 古今银熊 ...

  9. vue基本语法

    使用"{{ }}"来插入文本 使用v-html来插入html元素 v-bind给元素绑定属性,例如下面的,将title属性指定为data.title相同的值.v-bind指令后面的 ...

  10. Java Filter(拦截器)

    多个Filter按照在配置文件中配置的filter顺序执行. 在web.xml文件中配置该Filter,使用init-param元素为该Filter配置参数,init-param可接受如下两个子元素: ...