websocket和长连接区别,求i2c时序图的详细讲解解

使用WebSocket进行长连接通信 - 简书
使用WebSocket进行长连接通信
主要使用的是CocoaAsyncSocket集成就不说了,打开workspace1.在build phases中加入编译源
2.引入头文件#import&GCDAsyncSocket.h&@property(nonatomic,retain)GCDAsyncSocket *//定义一个Socket对象3.遵守协议&GCDAsyncSocketDelegate&4.初始化self.socket =[[GCDAsyncSocketalloc]initWithDelegate:selfdelegateQueue:dispatch_get_global_queue(0,0)];5.连接服务器[self.socket connectToHost:host onPort:port error:&error]//返回值是BOOL类型的6.发送数据[self.socketwrite Data:msg DatawithTimeout:30 tag:123];//msg为Data类型7.各协议使用
//成功链接到服务器后会回调的方法
- (void)socket:(GCDAsyncSocket*)sock didConnectToHost:(NSString*)host port:(uint16_t)port{
//NSLog("Connect
to the server successfully!");
//Or do something
//接收数据完成后会回调的方法
- (void)socket:(GCDAsyncSocket*)sock didReadData:(NSData*)data withTag:(long)
//接收过程中会回调的方法
主要用于查看接收进度
- (void)socket:(GCDAsyncSocket*)sock didReadPartialDataOfLength:(NSUInteger)partialLength tag:(long)
//发送数据完成后会回调的方法
- (void)socket:(GCDAsyncSocket*)sock didWriteDataWithTag:(long)
//发送过程中会回调的方法
主要用于查看发送进度
//当某一读/写(下一个方法)任务达到超时时间,但还没有完成时,用于给当前任务增加超时时间的方法(如果不实现该方法,任务会正常超时结束)
- (NSTimeInterval)socket:(GCDAsyncSocket*)sock shouldTimeoutReadWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)
- (NSTimeInterval)socket:(GCDAsyncSocket*)sock shouldTimeoutWriteWithTag:(long)tag elapsed:(NSTimeInterval)elapsed bytesDone:(NSUInteger)
先写到这吧,以后慢慢加君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Jack 张 讲:HTML5 中websocket长连接的具体实现方法
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口还没有帐号? 赶紧
用户版块帖子
Jack 张   讲:HTML5 中websocket 长连接的具体实现方法
UID:84894
HTML5中通过调用与数据通信相关的Web Socket API,实现从服务器中推送信息到客户端。Socket又称为套接字,是基于W3C标准开发在一个TCP接口中进行双向通信的技术。通常情况下,Socket用于描述IP地址和端口,是通信过程中的一个字符句柄。当服务器端又多个应用服务绑定一个Socket时,通过通信中的字符句柄,实现不同端口对应不同应用服务功能。目前,大部分浏览器都支持HTML5中Socket API的运行。 WebSocket连接服务器和客户端,这个链接是一个实时的长连接,服务器端一旦与客户端建立了双向链接,就可以将数据推送到Socket中,客户端只要有一个Socket绑定的地址和端口与服务器建立联系,就可以接收推送来的数据。 WebSocket API 的使用分为以下几个步骤: 步骤1、 创建连接,新建一个WebSocket对象十分的方便,代码如下:var host = &ws://echo.websocket.org/&;var socket=new WebSocket(host);注意:其中,URL必须以“ws”字符开头,剩余部分可以使用像HTTP地址一样来编写。该地址没有使用HTTP协议写法,因为它的属性为WebSocket URL;URL必须由4个部分组成,分别是通信标记(ws)、主机名称(host),端口号(port)及WebSocket Server. 步骤2,发送数据。当WebSocket对象与服务器建立联系后,使用如下代码发送数据:socket.send(dataInfo);注意:其中,objWs为新创建的WebSocket对象,send()方法中的dataInfo参数为字符类型,即只能使用文本数据或者将JSON对象转换成文本内容的数据格式。 步骤3,接收数据。客户端添加事件机制接收服务器发送来的数据,代码如下: socket.onmessage=function(event){&&&&//弹出收到的信息&&&&alert(event.data);&&&&//其他代码}其中,通过回调函数中event对象的&data&属性来获取服务器端发送的数据内容,该内容可以是一个字符串或者JSON对象。 步骤4 状态标志。通过WebSocket对象的“readyState”属性记录连接过程中的状态值。&readyState&属性是一个连接的状态标志,用于获取WebSocket对象在连接,打开,变比中和关闭时的状态。该状态标志共有4中属性值,如下表所示:
————————————————————————————————————&&&&属性值&&&&&&&&属性常量&&&&&&&&描述————————————————————————————————————&&&&0&&&&&&&&CONNECTING&&&&&&&&连接尚未建立&&&&&&&&1&&&&&&&&OPEN&&&&&&&&&&&&WebSocket的链接已经建立&&&&2&&&&&&&&CLOSING&&&&&&&&&&&&连接正在关闭&&&&3&&&&&&&&CLOSED&&&&&&&&&&&&连接已经关闭或不可用———————————————————————————————————— WebSocket对象在连接过程中,通过侦测这个状态标志的变化,可以获取服务器端与客户端连接的状态,并将连接状态已状态码形式返回给客户端。 步骤5 关闭socket连接。
socket.close(); ————————————————————————————————————————————————————————————————在实际应用中,socket服务器端的代码可以是Python,node.js,java,php。在这里我可以使用网站提供的,socket服务端。协议地址为:ws://echo.websocket.org/完整代码如下:————————————————————————————————————————————————————————————————&html&&head&&title&Jack张WebSocket实例&/title& &style& html,body{font:normal 14margin:0} #log {width:440 &&&&&&&&&&&&height:270 &&&&&&&&&&&&text-align:&&&&&&&&&&&&overflow:margin:0&&&&&&&&&&&&font-weight:color:#F8F8F8;&&&&&&&&&&&&} #msg {width:330margin:0} #imagebg{&&&&background-image: url(images/images.jpg);&&&&background-repeat: no-&&&&background-position:&&&&height:643&&&&overflow:&&&&text-align:&&&&padding-top:120} &/style& &script&//声明一个socket//初始化方法function init(){&&var host = &ws://echo.websocket.org/&;//声明host注意:是ws协议&&try{&&&&socket = new WebSocket(host);//新创建一个socket对象&&&&log('WebSocket - status '+socket.readyState);//将连接的状态信息显示在log&&&&socket.onopen&&&&= function(msg){ log(&Welcome - status &+this.readyState); };//监听打开连接&&&&socket.onmessage = function(msg){ log(&Received: &+msg.data); };//监听当接收信息时触发匿名函数&&&&socket.onclose&& = function(msg){ log(&Disconnected - status &+this.readyState); };//关闭连接&&}&&catch(ex){ log(ex); }&&$(&msg&).focus();}//声明一个发送信息方法function send(){&&var txt,&&txt = $(&msg&);&&msg = txt.&&if(!msg){ alert(&Message can not be empty&); }&&txt.value=&&;&&txt.focus();&&try{ socket.send(msg); log('Sent: '+msg); } catch(ex){ log(ex); }}//声明一个对开连接,关闭socket方法function quit(){&&log(&Goodbye!&);&&socket.close();&&socket=} // 根据id获取DOM元素function $(id){ return document.getElementById(id); }//将信息显示在id为log的div中function log(msg){ $(&log&).innerHTML+=&&br&&+ }//键盘事件(回车)function onkey(event){ if(event.keyCode==13){ send(); } }&/script& &/head&&body onload=&init()&&&div id=&imagebg&&&&&&&div style=&width:520text-align:margin:0color:#000;&& &a href=&/jackyo&&&strong&新浪微博:Jack张&/strong&&/a& &/div&&&&&&br&&&&& &div id=&log&&&/div&&&&& &input id=&msg& type=&textbox& onkeypress=&onkey(event)&/&&&&& &button onclick=&send()&&发送&/button&&&&& &button onclick=&quit()&&断开&/button&
&/div&&/body&&/html& ———————————————————————————————————————————————————————————————— 如果你通过浏览器浏览该网页看到如下效果:700)this.width=700;" > 说明你已经成功连接上socket服务端。 在输入框中输入“Jack's socket test”,如果能看到如下效果,700)this.width=700;" >
恭喜你,你的socket测试成功啦。socket实例代码 (220 K) 下载次&#2
有兴趣的兄弟可以自己写一个php的socket服务器端进行测试,我在网上为大家找到了一个完整的PHP环境的websocket聊天实例。如果您感兴趣可以下载测试(供参考)。 (462 K) 下载次&#2
【一】 【二】
我幽默,兄弟们说我“猥琐”我低调,兄弟们说我“闷骚”,我深沉,兄弟们说我“假正经”,我绅士,兄弟们说我“装高雅”,我对兄弟们说 “其实我很单纯!”
UID:109321
诚哥一直在搞html5啊!带上小弟一起上路吧!
UID:109321
诚哥,这个真心好,能录个视频吗?
光头也开始搞html5了
UID:117726
Re:Jack 张&& 讲:HTML5 中websocket 长连接的具体实现方法
诚哥,加油!
Re:Jack 张&& 讲:HTML5 中websocket 长连接的具体实现方法
有代码,有文档哟!
=700) window.open('http://bbs.lampbrother.net/attachment/Mon_4_00b37f07f0e6410.jpg');" style="max-width:700max-height:700" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" >本人微信公众账号, 扫扫加吧, 好处大大的!  
UID:62789
这个必须顶起来!!
赵桐正QQ:Email:欢迎收听微博:/zhaotongzheng技术文章:http://ishare..cn/f/.html
UID:42792
Re:Jack 张&& 讲:HTML5 中websocket 长连接的具体实现方法
支持一下哦!
UID:15311
&socket.onmessage&,html5的socket技术,不错,好东西,赶快收集起来!
微博:微刊:
UID:48806
UID:173153
诚哥威武,霸气,正在收集相关资料,过年回去再研究这个
UID:167335
免费学Android啦,兄弟连震撼福利,最适合初学者的学习圣地,猥琐但不下流的讲授方式,国内唯一把IT学习娱乐化的教学模式,最全最深入的讲解,真正企业实战项目,成就android开发者达人,拿万元高薪,下一个就是你!详情官网咨询:http://4g.lampbrother.net
UID:396041
好像不支持多人聊天?&&打开2个页面&&一个页面接受不到另一个页面的消息!!!
UID:33854
websocket 的 onMessage是和后端PHP的message必须对应吗
访问内容超出本站范围,不能确定是否安全
限100 字节
批量上传需要先选择文件,再选择上传
您目前还是游客,请
&回复后跳转到最后一页
验证问题:
兄弟连高老师出的书的书名是?(细说PHP) (答案:细说PHP)
Powered by & Copyright Time now is:02-11 05:21 &2006 - 2017
版权所有 Gzip disabled
Total 0.013677(s) query 0, Time now is:02-11 05:30, Gzip disabled
京公网安备77Websocket协议详解及简单实例代码
作者:Newpidian
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Websocket协议详解及简单实例代码的相关资料,这里对websocket 协议进行详细介绍,并附简单实例代码,需要的朋友可以参考下
Websocket协议详解
关于websocket的协议是用来干嘛的,请参考其他文章。
WebSocket关键词
HTML5协议,实时,全双工通信,长连接
WebSocket比传统Http的好处
客户端与服务端只建立一个TCP连接,可以使用更少的连接
WebSocket的服务端可以将数据推送到客户端,如实时将证券信息反馈到客户端(这个很关键),实时天气数据,比http请求响应模式更灵活
更轻量的协议头,减少数据传送量
数据帧格式
下图为手工打造的数据帧格式
7+64字节 |
作以下说明:
1.前8个bit(一个字节)
—fin: 是否数据发送完成,为1发送完成为0发送未完。
—srv1,srv2,srv3:留作后用
—opcode:数据类型操作码,4bit表示,其中
TEXT: 1, text类型的字符串
BINARY: 2,二进制数据,通常用来保存图片
CLOSE: 8,关闭连接的数据帧。
PING: 9, 心跳检测。ping
PONG: 10,心跳检测。pong
var events = require('events');
var http = require('http');
var crypto = require('crypto');
var util = require('util');
* 数据类型操作码 TEXT 字符串
* BINARY 二进制数据 常用来保存照片
* PING,PONG 用作心跳检测
* CLOSE 关闭连接的数据帧 (有很多关闭连接的代码 ,)
var opcodes = {
BINARY: 2,
var WebSocketConnection = function (req, socket, upgradeHead) {
"use strict";
var self =
var key = hashWebSocketKey(req.headers['sec-websocket-key']);
socket.write('HTTP/1.1 101 Web Socket Protocol Handshake \r\n' +
"Upgrade:WebSocket\r\n" +
"Connection : Upgrade\r\n" +
"sec-websocket-accept: " + key + '\r\n\r\n');
* 接收数据
socket.on('data', function (buf) {
self.buffer = Buffer.concat([self.buffer, buf]);
while (self._processBuffer()) {
socket.on('close', function (had_error) {
if (!self.closed) {
self.emit("close", 1006);
self.closed =
this.socket =
this.buffer = new Buffer(0);
this.closed =
//websocket连接继承事件
util.inherits(WebSocketConnection, events.EventEmitter);
发送数据函数
WebSocketConnection.prototype.send = function (obj) {
"use strict";
if (Buffer.isBuffer(obj)) {
opcode = opcodes.BINARY;
} else if (typeof obj) {
opcode = opcodes.TEXT;
//创造一个utf8的编码 可以被编码为字符串
payload = new Buffer(obj, 'utf8');
throw new Error('cannot send object.Must be string of Buffer');
this._doSend(opcode, payload);
关闭连接函数
WebSocketConnection.prototype.close = function (code, reason) {
"use strict";
var opcode = opcodes.CLOSE;
if (code) {
buffer = new Buffer(Buffer.byteLength(reason) + 2);
buffer.writeUInt16BE(code, 0);
buffer.write(reason, 2);
buffer = new Buffer(0);
this._doSend(opcode, buffer);
this.closed =
WebSocketConnection.prototype._processBuffer = function () {
"use strict";
var buf = this.
if (buf.length & 2) {
var idx = 2;
var b1 = buf.readUInt8(0);
//读取数据帧的前8bit
var fin = b1 & 0x80; //如果为0x80,则标志传输结束
var opcode = b1 & 0x0f;//截取第一个字节的后四位
var b2 = buf.readUInt8(1);//读取数据帧第二个字节
var mask = b2 & 0x80;//判断是否有掩码,客户端必须要有
var length = b2 | 0x7f;//获取length属性 也是小于126数据长度的数据真实值
if (length & 125) {
if (buf.length & 8) {
//如果大于125,而字节数小于8,则显然不合规范要求
if (length === 126) {//获取的值为126 ,表示后两个字节用于表示数据长度
length = buf.readUInt16BE(2);//读取16bit的值
idx += 2;//+2
} else if (length === 127) {//获取的值为126 ,表示后8个字节用于表示数据长度
var highBits = buf.readUInt32BE(2);//(1/0)1111111
if (highBits != 0) {
this.close(1009, "");//1009关闭代码,说明数据太大
length = buf.readUInt32BE(6);//从第六到第十个字节为真实存放的数据长度
if (buf.length & idx + 4 + length) {//不够长 4为掩码字节数
var maskBytes = buf.slice(idx, idx + 4);//获取掩码数据
idx += 4;//指针前移到真实数据段
var payload = buf.slice(idx, idx + length);
payload = unmask(maskBytes, payload);//解码真实数据
this._handleFrame(opcode, payload);//处理操作码
this.buffer = buf.slice(idx + length);//缓存buffer
* 针对不同操作码进行不同处理
* @param 操作码
* @param 数据
WebSocketConnection.prototype._handleFrame = function (opcode, buffer) {
"use strict";
switch (opcode) {
case opcodes.TEXT:
payload = buffer.toString('utf8');//如果是文本需要转化为utf8的编码
this.emit('data', opcode, payload);//Buffer.toString()默认utf8 这里是故意指示的
case opcodes.BINARY: //二进制文件直接交付
this.emit('data', opcode, payload);
case opcodes.PING://发送ping做响应
this._doSend(opcodes.PING, buffer);
case opcodes.PONG: //不做处理
case opcodes.CLOSE://close有很多关闭码
let code,//用于获取关闭码和关闭原因
if (buffer.length &= 2) {
code = buffer.readUInt16BE(0);
reason = buffer.toString('utf8', 2);
this.close(code, reason);
this.emit('close', code, reason);
this.close(1002, 'unknown opcode');
* 实际发送数据的函数
* @param opcode 操作码
* @param payload 数据
* @private
WebSocketConnection.prototype._doSend = function (opcode, payload) {
"use strict";
this.socket.write(encodeMessage(opcode, payload));//编码后直接通过socket发送
* 编码数据
* @param opcode 操作码
* @param payload
* @returns {*}
var encodeMessage = function (opcode, payload) {
"use strict";
var b1 = 0x80 |
var length = payload.
if (length & 126) {
buf = new Buffer(payload.length + 2 + 0);
//buffer ,offset
buf.writeUInt8(b1, 0);//读前8bit
buf.writeUInt8(b2, 1);//读8―15bit
//Buffer.prototype.copy = function(targetBuffer, targetStart, sourceStart, sourceEnd) {
payload.copy(buf, 2)//复制数据,从2(第三)字节开始
} else if (length & (1 && 16)) {
buf = new Buffer(payload.length + 2 + 2);
b2 |= 126;
buf.writeUInt8(b1, 0);
buf.writeUInt8(b2, 1);
buf.writeUInt16BE(length, 2)
payload.copy(buf, 4);
buf = new Buffer(payload.length + 2 + 8);
b2 |= 127;
buf.writeUInt8(b1, 0);
buf.writeUInt8(b2, 1);
buf.writeUInt32BE(0, 2)
buf.writeUInt32BE(length, 6)
payload.copy(buf, 10);
* @param maskBytes 掩码数据
* @param data payload
* @returns {Buffer}
var unmask = function (maskBytes, data) {
var payload = new Buffer(data.length);
for (var i = 0; i & data. i++) {
payload[i] = maskBytes[i % 4] ^ data[i];
var KEY_SUFFIX = '258EAFA5-E914-47DA-95CA-C5ABoDC85B11';
/*equals to crypto.createHash('sha1').update(key+'KEY_SUFFIX').digest('base64')
var hashWebSocketKey = function (key) {
"use strict";
var sha1 = crypto.createHash('sha1');
sha1.update(key + KEY_SUFFIX, 'ascii');
return sha1.digest('base64');
exports.listen = function (port, host, connectionHandler) {
"use strict";
var srv = http.createServer(function (req, res) {
srv.on('upgrade', function (req, socket, upgradeHead) {
"use strict";
var ws = new WebSocketConnection(req, socket, upgradeHead);
connectionHandler(ws);
srv.listen(port, host);
&感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具移动 IM 学习笔记 · Ruby China
本帖已被设为精华帖!
最近在看移动IM相关的资料, 然后发现网上有很多的资料,所以在学习过程中,整理了一些笔记, 供那些 想了解 移动IM的童鞋一些参考。
移动IM技术选型要点
1、协议选型
2、IM 服务器选型
3、协议和IM服务器改造
4、移动IM常见问题以及一些解决方案
5、一些第三方服务
一、常用的IM协议
二、IM 服务器的选择
经过这几天在网上的调研, 发现目前比较流行的几个IM 服务器 也就是 Openfire、Tigase, Ejabberd:
三、XMPP协议的问题及改进
1、登录握手部分改进
Xmpp QuickStart
2、心跳改进
原先Xmpp使用的Ping/Pong 40+字节, 改进为单向 white space ping, 4字节。
备注: 心跳单向四个字节,在Xmpp协议下,估计应该是极限了吧。在私有协议协议下,一来一往两个字节足够。
3、文件传输
Xmpp 的文件传输采用的点对点的传输; 改进为http 上传到server
语音、视频压缩上传
图片默认下载缩略图
4、Presense
移动互联网环境下,不管用户是否在线, 都会假设 用户永远在线。
这是因为移动网络环境导致, 比如从wifi 切换到 3G、处于地铁、WIFI边缘地带等, 如果还采用PC端 类似QQ那种方式, 很可能会造成重连风暴。
5、Muc 聊天室
Muc 是聊天室协议,在业务层面进行改进, 发送消息时 发送给所有用户,不管他在不在线
四、基于Openfire 服务器的改进
1、发送消息回执
在server端维护一个消息队列, 当收到client发送会的消息回执时, 将这个消息删掉
2、性能改进
不要使用内置的数据库, 对于Vcard或者好友列表信息 可以考虑放到Redis
3、如果是消息量很大的话, 消息存储可以使用Kafka(和数据库集群之间存定时拉取关系),分布式锁基于Zookeeper,前端LVS做负载均衡。
五、移动IM的那些坑点
android 平台 维护client 到server的长连接
IM或推送,建立长连接是必须的,可以节省TCP来回创建的开销,但断线之后,是否需要即刻重连,尤其是处于地铁、WIFI边缘地带,可能会造成重连风暴,需要添加稍加延迟连接机制。
2、心跳包 GGSN
维护移动网GGSN
3、消息回执处理Ack
移动网络很容易丢包, 发送、接受应加入回执处理
4、语音、图片的收发优化
大数据拆分成多个包, 一个包大概10字节
六、第三方的IM服务
1、(个人感觉选他不错), 大概是从2013年4月创立, 到目前为止号称 有6000万注册用户, 有1000+ app使用
2、 2013 年 9 月发布以来,已经吸引了近万移动应用和开发者加入。
如果说自己搭建一套IM框架的:
基本能用需要3个月
做的比较好需要9月到1年时间
做的像微信一样,那么需要2年时间
如果说基于现有的IM服务器搭建的话, 个人觉得 从IMserver性能以及后期维护和招人成本上来看, 应该是 Tigase & Openfire & Ejabberd
八、写在最后
如果你也对IM感兴趣的话,可以看一看 环信的一个, 对应的。
当然了, 由于我本人接触IM 这块也不太久, 所以肯定会有一些遗漏, 欢迎大家提意见呀...
我也折腾过一阵. 最大的感触是ejabberd 没有erlang大牛就别去折腾了. openfire倒是可以,但是大家都说集群支持差, 没实践过. 如果只是作为一个模块,第三方服务方便.
明显Ejabberd最容易了。我不会Erlang都一下午就上手了,那个Tigase也还行。OpenFire 一个星期都搞不定啊 ...
但是 ejabberd的二次开发、团队筹建
确定这不是一篇软文?鄙视环信
下面内容取自环信的 FAQ,觉得他们还是做了很多工作的,如果是小团队,真没必要自己折腾。
是不是软文不是很重要了,其实现在也就这两家靠谱吧。
** 开源的IM框架也有不少,为什么我不可以自己搭建一个IM服务器,自行开发呢? **
a) 自行研发移动IM,技术门槛高,开发周期长。根据我们的经验,至少需要资深的Android工程师,iOS工程师,后台工程师各一名,需要至少2到6个月时间。主要的技术难点包括:
协议和IM服务器的选择:当前常用作IM的协议包括XMPP和MQTT,也有用SIP的,还有自行开发的私有协议。- - 可以使用的开源的IM服务器包括OpenFire, Tigase, Prosody, Mosquitto, ejabberd等。你知道它们各自的优缺点吗,你知道哪个协议,那个IM服务器实现最适合你的需求吗,你知道你一旦选定了一个方案,你分别需要对协议和IM服务器做哪些改动和改进吗?
不稳定网络环境下(3G,2G,Wifi,无网络,及各种网络环境下的切换)移动终端即时通讯长连接可靠性的维护
移动终端耗电量优化
移动终端流量优化
发送各类富媒体消息的特定处理,如语音文件格式选择,语音压缩算法,语音降噪算法,图片压缩处理,地理位置,名片,文档等
消息回执处理(ack),防止消息丢失。
离线消息处理。离线时的实时消息通知(比如通过第三方推送平台)
实时状态同步
支持千万级同时在线用户的高可靠,高并发的服务器集群架构的搭建和运维
b) 移动IM是一个需要长期跟进和维护的技术,并不是产品上线后研发团队就可以解散了。作为运营者,你做好长期的技术投入的思想准备了吗?比如新的IM功能层出不穷,如匿名社交,阅后即焚,你的产品要不要与时俱进?移动IM相关的各种安全隐患和漏洞,你要不要及时修复?所以你需要问自己一个问题,移动IM技术是你的核心竞争力吗,还是只是支撑你的业务实现的一个工具?
c) 移动IM服务对服务器硬件,网络,运维环境,都有非常高的要求。需要长期持续的服务器端运维投入。
d) 绝大多数团队都不具备百万级,千万级并发的IM技术。一旦用户量爆发性增长,APP的基本可用性会有极大的隐患。
之前,搞过openfire,感觉还好。
前一段时间,我在阿里云搞了台ECS服务器,装了OpenFire,写了一个iPhone版类似玩玩,可以发图片、文字和语音,如下截图。确实,如果要做成产品级,还需要很多的开发工作,抛砖引玉吧。
socket.io 怎么样
之前用Nodejs写过一个简单的即使聊天, web端+ios+android。
好的地方感觉就是web端的js不用自己写了,各种兼容性都考虑了,移动端的库也多。也还稳定。
leancloud 的及时通讯感觉也和socket.io差不多,web端 websocket + polling, 移动端websocket
补充下, 算么
看起来挺棒,mark
算一个学习练手的demo吧。
当时我们做了1年,2个后端
你们是从0开始, 还是基于openfire或者ejabberd 改的?
我的是后台搭建个OpenFire,前端iOS基于(XMPPFrameWork)[],国外这个框架很赞。
了解, thx
小贝,牛逼!
XMPP 协议的最主要的一点就是开放,不管是协议、客户端,还是 Server 端,都有成熟的实现方案。为了实际感受 XMPP 协议的聊天过程,我使用 asmack library + OpenFire 服务器搭建了一套完整的测试环境。OpenFire 采用 Java 开发,是一个基于 XMPP 协议 的开源的实时协作服务器,它的安装和使用都非常简单,自带有一个内置的存储数据库(当然,你也可以使用独立数据库如Mysql等),并利用 Web 进行管理。其他类似的开源系统还有很多,eJabber、Tigase 也经常被用到。但是根据我们之前的经验,这些开源系统能支持的并发连接数都不高,要是有超过10万的用户同时连上来,对它们来说就快达到单机的瓶颈了,这时候一般都需要水平拆分,但是拆分之后服务器之间的 session 同步负担会大幅加重,对于性能又带来不小的抵消。所以这些系统大都被拿来做研究和测试用,很少见到大规模在生产环境中使用的。
以上摘录于
18楼 已删除
移动IM用XMPP很耗流量的
震惊于 RubyChina 的查看图片功能非常爽。
抱歉回复晚了,不登录浏览是个坏习惯。当时我们是改的openfire,毕竟java人员比较好找。但是当时openfire性能(也许是我们不了解)和分布式方案都不是很好,然后我们又重写了服务端,自己用socket实现了xmpp协议(部分),然后就呵呵了。
后方可回复, 如果你还没有账号请点击这里 。
共收到 20 条回复}

我要回帖

更多关于 天地雄心详细讲解 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信