- 浏览: 1481333 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (419)
- XMPP (19)
- Android (180)
- Java (59)
- Network (4)
- HTML5 (13)
- Eclipse (9)
- SCM (23)
- C/C++ (4)
- UML (4)
- Libjingle (15)
- Tools&Softwares (29)
- Linphone (5)
- Linux&UNIX (6)
- Windows (18)
- Google (10)
- MISC (3)
- SIP (6)
- SQLite (5)
- Security (4)
- Opensource (29)
- Online (2)
- 文章 (3)
- MemoryLeak (10)
- Decompile (5)
- Ruby (1)
- Image (1)
- Bat (4)
- TTS&ASR (28)
- Multimedia (1)
- iOS (20)
- Asciiflow - ASCII Flow Diagram Tool.htm (1)
- Networking (1)
- DLNA&UPnP (2)
- Chrome (2)
- CI (1)
- SmartHome (0)
- CloudComputing (1)
- NodeJS (3)
- MachineLearning (2)
最新评论
-
bzhao:
点赞123!
Windows的adb shell中使用vi不乱码方法及AdbPutty -
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
HTML5 WebSocket 技术介绍 -
obehavior:
view.setOnTouchListenerview是什么
[转]android 一直在最前面的浮动窗口效果 -
wutenghua:
[转]android 一直在最前面的浮动窗口效果 -
zee3.lin:
Sorry~~
When I build "call ...
Step by Step about How to Build libjingle 0.4
From:
http://bbs.7boo.com.cn/thread-1940-1-1.html
XMPP协议之Socket5 Bytestream文件传输
SOCK5流协商的建立一部分通过XMPP XML流,一部分通过一个独立的socket
实际的文件传输发生在创建的socket上。
第一步:
[发送端] 发送SI(流协商)包A
A:
<iq type='set' id='gaim8215f9ef' [email=to=]to='test@dd.antkingdom.com/Exodus'[/email]>
<si xmlns='http://jabber.org/protocol/si' id='gaim8215f9f0' profile='http://jabber.org/protocol/si/profile/file-transfer'>
<file xmlns='http://jabber.org/protocol/si/profile/file-transfer' name='backup.txt' size='2043'/>
<feature xmlns='http://jabber.org/protocol/feature-neg'>
<x xmlns='jabber:x:data' type='form'><field var='stream-method' type='list-single'>
<option><value>http://jabber.org/protocol/bytestreams</value></option>
</field>
</x>
</feature>
</si>
</iq>
[接收端] 接收A: 发送SI响应包B
B:
<iq id="gaim8215f9ef" to="[email=jjl@dd.antkingdom.com/Home]jjl@dd.antkingdom.com/Home[/email]" type="result">
<si id="gaim8215f9f0" xmlns="http://jabber.org/protocol/si">
<feature xmlns="http://jabber.org/protocol/feature-neg">
<x type="submit" xmlns="jabber:x:data">
<field var="stream-method"><value>http://jabber.org/protocol/bytestreams</value></field>
</x>
</feature>
</si>
</iq>
第二步:
[发送端] 接收B
创建socket,绑定一个地址,并监听(记下IP与端口号),等待连接
构造出如下的bytestream包C,发送包C
C:
<iq type='set' id='gaim8215f9f1' [email=to=]to='test@dd.antkingdom.com/Exodus'[/email]>
<query xmlns='http://jabber.org/protocol/bytestreams' sid='gaim8215f9f0'>
<streamhost [email=jid=]jid='jjl@dd.antkingdom.com/Home'[/email] host='192.168.100.1' port='6642'/>
</query>
</iq>
[接收端] 接收C:
创建一个socket, connect C包中指定的host与port
开始socket 5协商
socket 5协商完毕,发送bytestream响应包D
D:
<iq [email=from=]from='test@dd.antkingdom.com/Exodus'[/email] type='result' [email=to=]to='jjl@dd.antkingdom.com/Home'[/email] id='gaim8215f9f1'>
<query xmlns='http://jabber.org/protocol/bytestreams' sid='gaim8215f9f0'>
<streamhost-used [email=jid=]jid='jjl@dd.antkingdom.com/Home'/[/email]>
</query>
</iq>
第三步:
[发送端] 接收D
开始文件传输
Socket 5协商过程
一、[接收端]发送5,1,0
二、[发送端]接收到5,1,0,发送5,0
三、[接收端]接收到5,0,发送5,1,0,3+digest长度+0+0
注:digest是通过sessionID, 流发起者,流接收者,通过哈希算法得到的一个字符串
四、[发送端]接收到5,1,0,3+digest长度+0+0,发送5,0,0,3+digest长度+0+0
五、socket 协商完毕,建立了P2P的连接,下面通过这个连接的socket就可以进行文件传输了。
jabber/XMPP文件传输的一些情况
1 jabber/XMPP文件传输的一些情况
大家知道,Jabber/XMPP是一种 XML流技术,解决的问题主要是即时消息和出席信息,XML流技术并不适用于大数据量的传输。
即时通信应用中,消息和出席信息的问题相对是比较简单和容易实现的,XMPP的在这方面的长处在于两点:
- 使用了XML流技术,XML天然的结构化和可扩展性特性,非常适合小数据量的字符信息交换。
- 更重要的,XMPP是一个公开的免费的标准,使得不同组织机构的即时消息可以互通,促使IM技术和应用从垄断走向平民化。
----- 但是即时通信的同样也离不开大数据量传输,来解决文件分享,多媒体应用等问题。为了解决这些问题,XEPs中提出了一些办法。在此之前,我们要区分什么是大数量传输,在XMPP\/XEP中,信息传输是所谓字符传输,而数据传输则是字节流传输(bytestreams)。
XEP中对于bytestreams的规定大致如下:
* XEP-0096: File Transfer 这是传输文件的统一接口,客户端之间用它来协商到底采用那种具体的传输方式,包括以下三种。
* XEP-0047: In-Band ByteStreams 带内字节流,这个协议实际上用于小数据量传输,只是它用的字节流传输,所以也顺便说一下。带内,也就是夹带在XML流中,通过XMPP服务器中转传输。具体用法是把数据用base64编码放在XML流中传给对方。这个办法不好,base64编码效率很低,而且所有数据必须由服务器中转。
* XEP-0066: Out of Band Data 带外字节流,带内不行就走带外,也就是不经过XMPP服务器。这个用法是在发起传输的客户端临时建立一个http服务(当然也可以是别的服务),把自己的 IP和端口(通过XMPP消息)告诉接收方,让对方直接来下载。这个方法有一个问题,发送一方必须是公网IP,否则对方无法访问。 注:目前Pandion,Linq支持这个XEP。
* XEP-0065: SOCKS5 Bytestreams SOCKS5字节流,使用SOCKS5传输文件,有直连式和代理传输两种方式。发送方把预定的IP和端口(通过XMPP消息)告诉接收方。如果双方都在公网,采用SOCKS直接传输。如果任何一方在内网,经过SOCKS5代理服务器传输,发送方把代理服务器的IP和端口告诉给接收方。这里的SOCKS5代理服务器和通用的代理服务器稍有差别,因为它需要通过发送方提出的一个sessionID由XMPP服务器通知SOCKS5代理服务器把双方的SOCKS 通道连通,也就是激活。 注:目前Psi,Linq支持这个XEP。
----- google的gtalk宣布采用XMPP标准之后,对于大数据量传输又采用了新的办法,也就是jingle。这个协议除了考虑文件传输,更多的考虑到了多媒体应用,不过总体来说它的思路和前述的方法相差不大,或者说是前述的XEP的扩展和优化。目前jingle在XEP中还处于试验状态,但是在 gtalk中已经采用了jingle,而且gtalk完全不支持前述的XEPs。
大鳄都是这样了,仗着自己有钱有势......。
不过还是要说一下这个jingle,因为google毕竟把jingle公开了,这一点好过某些商业IM服务提供商,至少我们有机会去兼容它。
- XEP-0166: Jingle 这个协议的重点是考虑多媒体应用,当然也包括文件传输,它提出了一些多媒体应用的管理,如字节数据和描述数据分离以及多应用多会话的接口管理方面的建议,对于不同类型的应用,也有相应的jingle补充协议一一描述,如下表:
协议 描述
XEP-0166: Jingle 负责协商和管理所有带外传输的会话
XEP-0167: Jingle Audio via RTP 用RTP传输音频
XEP-0176: Jingle ICE Transport 用ICE传输方法建立和管理数据连接
XEP-0177: Jingle Raw UDP Transport 纯UDP传输
XEP-0180: Jingle Video via RTP 用RTP传输视频
XEP-0181: Jingle DTMF 对DTMF的简单支持
注1:ICE还是IETF正在开发的协议,尚未定型。
注2:DTMF也就是双音频拨号的电话,这里对DTMF的支持只是从XMPP的角度规定,可以管理类DTMF的会话,这样可以通过电话网关在XMPP客户端和普通电话之间用语音聊天。
这些是应用层面的东西,和这里的话题关系不大,另文再说。现在只说在实际字节传输的处理过程。 jingle的自己传输分为三类:
* 发送方在外网,采用类似oob(XEP-0066: Out of Band Data)的方式传输.
* 发送方在内网,采用STUN服务传输,也就是内网客户端的端口影射服务,把内网的IP和端口影射到STUN的IP和特定端口上,然后把这个外网的IP和端口告诉对方,然后还是采用类似oob(XEP-0066: Out of Band Data)的方式传输。
* 发送方在内网,但是没有可用的STUN服务器,采用relay server来转发,也就是这类似于proxy65(XEP-0065: SOCKS5 Bytestreams)的传输方式。
http://bbs.7boo.com.cn/thread-1940-1-1.html
XMPP协议之Socket5 Bytestream文件传输
SOCK5流协商的建立一部分通过XMPP XML流,一部分通过一个独立的socket
实际的文件传输发生在创建的socket上。
第一步:
[发送端] 发送SI(流协商)包A
A:
<iq type='set' id='gaim8215f9ef' [email=to=]to='test@dd.antkingdom.com/Exodus'[/email]>
<si xmlns='http://jabber.org/protocol/si' id='gaim8215f9f0' profile='http://jabber.org/protocol/si/profile/file-transfer'>
<file xmlns='http://jabber.org/protocol/si/profile/file-transfer' name='backup.txt' size='2043'/>
<feature xmlns='http://jabber.org/protocol/feature-neg'>
<x xmlns='jabber:x:data' type='form'><field var='stream-method' type='list-single'>
<option><value>http://jabber.org/protocol/bytestreams</value></option>
</field>
</x>
</feature>
</si>
</iq>
[接收端] 接收A: 发送SI响应包B
B:
<iq id="gaim8215f9ef" to="[email=jjl@dd.antkingdom.com/Home]jjl@dd.antkingdom.com/Home[/email]" type="result">
<si id="gaim8215f9f0" xmlns="http://jabber.org/protocol/si">
<feature xmlns="http://jabber.org/protocol/feature-neg">
<x type="submit" xmlns="jabber:x:data">
<field var="stream-method"><value>http://jabber.org/protocol/bytestreams</value></field>
</x>
</feature>
</si>
</iq>
第二步:
[发送端] 接收B
创建socket,绑定一个地址,并监听(记下IP与端口号),等待连接
构造出如下的bytestream包C,发送包C
C:
<iq type='set' id='gaim8215f9f1' [email=to=]to='test@dd.antkingdom.com/Exodus'[/email]>
<query xmlns='http://jabber.org/protocol/bytestreams' sid='gaim8215f9f0'>
<streamhost [email=jid=]jid='jjl@dd.antkingdom.com/Home'[/email] host='192.168.100.1' port='6642'/>
</query>
</iq>
[接收端] 接收C:
创建一个socket, connect C包中指定的host与port
开始socket 5协商
socket 5协商完毕,发送bytestream响应包D
D:
<iq [email=from=]from='test@dd.antkingdom.com/Exodus'[/email] type='result' [email=to=]to='jjl@dd.antkingdom.com/Home'[/email] id='gaim8215f9f1'>
<query xmlns='http://jabber.org/protocol/bytestreams' sid='gaim8215f9f0'>
<streamhost-used [email=jid=]jid='jjl@dd.antkingdom.com/Home'/[/email]>
</query>
</iq>
第三步:
[发送端] 接收D
开始文件传输
Socket 5协商过程
一、[接收端]发送5,1,0
二、[发送端]接收到5,1,0,发送5,0
三、[接收端]接收到5,0,发送5,1,0,3+digest长度+0+0
注:digest是通过sessionID, 流发起者,流接收者,通过哈希算法得到的一个字符串
四、[发送端]接收到5,1,0,3+digest长度+0+0,发送5,0,0,3+digest长度+0+0
五、socket 协商完毕,建立了P2P的连接,下面通过这个连接的socket就可以进行文件传输了。
jabber/XMPP文件传输的一些情况
1 jabber/XMPP文件传输的一些情况
大家知道,Jabber/XMPP是一种 XML流技术,解决的问题主要是即时消息和出席信息,XML流技术并不适用于大数据量的传输。
即时通信应用中,消息和出席信息的问题相对是比较简单和容易实现的,XMPP的在这方面的长处在于两点:
- 使用了XML流技术,XML天然的结构化和可扩展性特性,非常适合小数据量的字符信息交换。
- 更重要的,XMPP是一个公开的免费的标准,使得不同组织机构的即时消息可以互通,促使IM技术和应用从垄断走向平民化。
----- 但是即时通信的同样也离不开大数据量传输,来解决文件分享,多媒体应用等问题。为了解决这些问题,XEPs中提出了一些办法。在此之前,我们要区分什么是大数量传输,在XMPP\/XEP中,信息传输是所谓字符传输,而数据传输则是字节流传输(bytestreams)。
XEP中对于bytestreams的规定大致如下:
* XEP-0096: File Transfer 这是传输文件的统一接口,客户端之间用它来协商到底采用那种具体的传输方式,包括以下三种。
* XEP-0047: In-Band ByteStreams 带内字节流,这个协议实际上用于小数据量传输,只是它用的字节流传输,所以也顺便说一下。带内,也就是夹带在XML流中,通过XMPP服务器中转传输。具体用法是把数据用base64编码放在XML流中传给对方。这个办法不好,base64编码效率很低,而且所有数据必须由服务器中转。
* XEP-0066: Out of Band Data 带外字节流,带内不行就走带外,也就是不经过XMPP服务器。这个用法是在发起传输的客户端临时建立一个http服务(当然也可以是别的服务),把自己的 IP和端口(通过XMPP消息)告诉接收方,让对方直接来下载。这个方法有一个问题,发送一方必须是公网IP,否则对方无法访问。 注:目前Pandion,Linq支持这个XEP。
* XEP-0065: SOCKS5 Bytestreams SOCKS5字节流,使用SOCKS5传输文件,有直连式和代理传输两种方式。发送方把预定的IP和端口(通过XMPP消息)告诉接收方。如果双方都在公网,采用SOCKS直接传输。如果任何一方在内网,经过SOCKS5代理服务器传输,发送方把代理服务器的IP和端口告诉给接收方。这里的SOCKS5代理服务器和通用的代理服务器稍有差别,因为它需要通过发送方提出的一个sessionID由XMPP服务器通知SOCKS5代理服务器把双方的SOCKS 通道连通,也就是激活。 注:目前Psi,Linq支持这个XEP。
----- google的gtalk宣布采用XMPP标准之后,对于大数据量传输又采用了新的办法,也就是jingle。这个协议除了考虑文件传输,更多的考虑到了多媒体应用,不过总体来说它的思路和前述的方法相差不大,或者说是前述的XEP的扩展和优化。目前jingle在XEP中还处于试验状态,但是在 gtalk中已经采用了jingle,而且gtalk完全不支持前述的XEPs。
大鳄都是这样了,仗着自己有钱有势......。
不过还是要说一下这个jingle,因为google毕竟把jingle公开了,这一点好过某些商业IM服务提供商,至少我们有机会去兼容它。
- XEP-0166: Jingle 这个协议的重点是考虑多媒体应用,当然也包括文件传输,它提出了一些多媒体应用的管理,如字节数据和描述数据分离以及多应用多会话的接口管理方面的建议,对于不同类型的应用,也有相应的jingle补充协议一一描述,如下表:
协议 描述
XEP-0166: Jingle 负责协商和管理所有带外传输的会话
XEP-0167: Jingle Audio via RTP 用RTP传输音频
XEP-0176: Jingle ICE Transport 用ICE传输方法建立和管理数据连接
XEP-0177: Jingle Raw UDP Transport 纯UDP传输
XEP-0180: Jingle Video via RTP 用RTP传输视频
XEP-0181: Jingle DTMF 对DTMF的简单支持
注1:ICE还是IETF正在开发的协议,尚未定型。
注2:DTMF也就是双音频拨号的电话,这里对DTMF的支持只是从XMPP的角度规定,可以管理类DTMF的会话,这样可以通过电话网关在XMPP客户端和普通电话之间用语音聊天。
这些是应用层面的东西,和这里的话题关系不大,另文再说。现在只说在实际字节传输的处理过程。 jingle的自己传输分为三类:
* 发送方在外网,采用类似oob(XEP-0066: Out of Band Data)的方式传输.
* 发送方在内网,采用STUN服务传输,也就是内网客户端的端口影射服务,把内网的IP和端口影射到STUN的IP和特定端口上,然后把这个外网的IP和端口告诉对方,然后还是采用类似oob(XEP-0066: Out of Band Data)的方式传输。
* 发送方在内网,但是没有可用的STUN服务器,采用relay server来转发,也就是这类似于proxy65(XEP-0065: SOCKS5 Bytestreams)的传输方式。
发表评论
-
Android Push Notification
2012-03-22 16:09 1229http://sourceforge.net/projects ... -
使用 XMPP 构建一个基于 web 的通知工具
2011-03-01 10:32 1532http://www.ibm.com/developerwor ... -
Smack 3.2.0 Beta has been released
2011-02-27 20:10 1315大约2个星期前, Smack发布3.2.0 Beta版. 距离 ... -
Jingle XMPP stanza对应的XML schema
2011-02-25 20:22 2873一个典型的Jingle XMPP stanza: <i ... -
GMail add 'voice and video chat' support
2011-02-18 13:32 1920GMail增加对视频聊天的 ... -
Ident协议
2011-02-08 18:06 3257为何要安装 identd ? 曾听过有人形容 id ... -
[原创]使用Smack库实现Google Talk XMPP Extensions - Gmail Notifications (含完整的实现代码以及例子)
2011-02-07 21:39 2609注意: 这里有本人所写的完整的代码, 所以如果要转载, 请征得 ... -
贴个XMPP logs看看Pidgin是如何传输文件的
2011-02-07 20:40 2566zhangsan给lisi发送01.jpg文件. (20:2 ... -
晕, Pidgin在Windows上不支持Voice&Viedo
2011-02-07 20:03 1554从http://pidgin.im/上下载了最新版本2.7.9 ... -
GTALK的运行参数
2011-02-06 21:51 1805/nomutex 同时打开多个Talk。 /forcestar ... -
Smack Jingle库所用的JSTUN库存在的bug
2011-02-06 19:52 4452运行Smack Jingle demo时(http://fis ... -
Google Talk Call Signaling
2011-02-05 22:53 1369http://code.google.com/intl/zh- ... -
几种XMPP客户端实现Jingle语音聊天的总结
2011-02-05 20:48 30811XMPP客户端除了最基本的发送/接收消息,显示好友列表等功能外 ... -
关于ejabberd在Windows 7无法启动
2011-02-04 22:13 2232用了Openfire作为XMPP Server后,突然想试试e ... -
XMPP Client
2011-02-04 20:58 1490Spark http://www.igniterealtime ... -
XMPP Server
2011-02-04 20:50 1683Openfire http://www.igniterealt ... -
XEP-0065: SOCKS5 Bytestreams
2011-02-04 15:24 2936SOCKS5 Bytestreams ("S ... -
XEP-0047: In-Band Bytestreams
2011-02-04 14:34 2144In-Band Bytestreams (IBB) http: ...
相关推荐
基于Asmack库 xmpp 协议 socket5 文件传输
通过绑定你的gmail邮箱 既可以通过xmpp协议即时传输数据
XMPP协议中文参考指南
基于XMPP协议实现一套Socket通信程序,解决服务器多IP、多网卡自动识别的问题(C/S都带,VS2013打开,可学习,也可直接使用,物超所值)
XMPP体系架构 XMPP server:其内核是一个XMPP路由器,完成基本组件间的数据包交换和路由。 功能: 1.会话管理器:负责客户端会话认证,在线状态,用户联系表等 ...5.传输器:建立xmpp服务器与非xmpp服务器通信
SocketClient.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
xmpp协议和xmpp扩展协议,chm格式
一个很好的基于XMPP协议通信的源码例子,之前在网上下载了很多基于XMpp协议的例子都不好使,经自己改动后能正常通信,VS2010
xmpp协议 XMPP协议工具openfire_3_10_3。
xmpp协议介绍PPT,详细介绍了XMPP核心协议方方面面
XMPP协议之RFC6120,英文版,用户可以在此获取并查看
XMPP协议的核心部分,中文名称可扩展消息出席协议
基于XMPP协议的WebRTC,应用与Web端HTML5的一个demo,仅供大家参考;大家一起学习。
XMPP_协议介绍,手机客户端需要实现即时通信功能,在通信协议上采用开放的Jabber(XMPP)协议,整个XMPP协议最为核心也是最为复杂的部分是Subscription的运行机制,抓取了一下相关的通信协议报文,供开发时候参考。
不可多的XMPP协议中文帮助文档,大家可要下来保存哦!
android asmack 注册 登陆 聊天 多人聊天室 文件传输ASmack.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
Ⅺ咿P协议的即时通信系统,文件传输只是作为系统的最重要 的组成部分,用于传输普通的文件及在系统中用到的数字签名 文件。基于)m但P协议的文件传输也是基于Ⅺv儿流的传输方 式传输数据,为以后不同风格代码和外来...
仿微信聊天软件,Socket实现.zip,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
xmpp协议的服务器端安装文件openfire