- 浏览: 1501708 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (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
XMPP客户端除了最基本的发送/接收消息,显示好友列表等功能外,语音/视频聊天,文件传输等功能也很有必要. 而XMPP Jingle是实现媒体流的协议. 既然一些客户端和服务器都支持XMPP Jingle, 所以就想测试一下语音聊天的功能.
这里要测试的XMPP客户端有Psi和Spark, 要测试XMPP服务器有Openfire和Google GTalk Server (talk.google.com:5222).
我的网络环境是, 家里有2台笔记本,都通过Wifi连接到无线路由器,而无线路由器通过ADSL连接到外网. 每台笔记本都安装一个客户端, 然后想通过两个客户端来语音聊天. 其中在一个笔记本上同时安装了Openfire服务器.
下面就是我整个测试过程,步骤挺曲折的,无数次失败,好在总算摸清了规律,并且成功了一个case.
Case 1: LaptopA安装了Spark和Openfire, LaptopB安装了Spark.
接收方可以收到语音聊天邀请,但Accept后,发送方或者接收方最后会提示"Session closed due to Closed Remotely"或者"Voice chat ended: No Media Received. This may be caused by firewall configuration problems."
在网上发现很多人也遇到过这样的问题, 但至今没有答案, 而且我将firewall关闭后还是不行. 分析XMPP packets, 一切都是正常的.
Case 2: LaptopA安装了Psi和Openfire, LaptopB安装了Psi.
接收方可以收到语音聊天邀请,但Accept后, 最后发送方会提示"Call was rejected or terminated". 通过分析XMPP packets,发现原来LaptopA的Psi获得的candidates地址是"127.0.0.1", LaptopA当然不能通过这个地址来和LaptopB进行语音聊天了, 原因估计是Openfire也安装在LaptopA. 如果有第三台电脑安装Openfire,估计能成功, 可惜实在不想启动家里那台过时速度极慢的台式机了.
Case 3: Psi和Spark互联
失败. 原来这两者目前支持的transport method不一样,从Case 1和2的XMPP packets可以发现, Spark支持"http://jabber.org/protocol/jingle/transport/ice",而Psi支持"urn:xmpp:jingle:transports:ice-udp:1",搞不懂两者有什么区别. 看来两个不同的IM完全互联也不是那么容易的.
到这里我已经有些灰心了,各种组合都试过了,都不行, Psi和Psi是有希望的,但需要第三台电脑运行Openfire服务器, 有没有其他的服务器,除了Google GTalk服务器, 但Gooelg GTalk目前不是完全按照Jingle来实现, 虽然Jingle是Google提出来的. 按照他们的说法, 等Jingle标准稳定下来后他们会按照Jingle来实现的, 可以参照一篇介绍: http://supermmx.org/blog/20061019_gtalk
放弃了!!!
突然, 想起来了, Jingle的实现其实不需要服务器有什么改动的, 主要是要求客户端的支持. Jingle是利用当前的XMPP协议来作为信令协议(signaling protocol)来建立和协商会话的, 对于这一点, 服务器不需要改动的,因为这个信令协议只不过是扩展IQ packet加个<jingle>. Jingle的关键是如何两个客户端之间建立流通道, 如果有客户端在NAT之后还需要利用ICE协议实现NAT穿越. 既然Jingle基本上不需要服务器的改动, 那么Google GTalk服务器是可以使用的, 于是就有这个成功的case.
Case 4: LaptopA安装了Psi, LaptopB安装了Psi, 都连接到Google GTalk服务器
成功!!!!!万岁!!!!!效果还很不错!!!
Case 5: LaptopA安装了Spark, LaptopB安装了Spark, 都连接到Google GTalk服务器
还是失败. 后面测试打算主要用Psi了, Spark不给力啊, 论坛上那么多问题都没人解答.
这里要测试的XMPP客户端有Psi和Spark, 要测试XMPP服务器有Openfire和Google GTalk Server (talk.google.com:5222).
我的网络环境是, 家里有2台笔记本,都通过Wifi连接到无线路由器,而无线路由器通过ADSL连接到外网. 每台笔记本都安装一个客户端, 然后想通过两个客户端来语音聊天. 其中在一个笔记本上同时安装了Openfire服务器.
下面就是我整个测试过程,步骤挺曲折的,无数次失败,好在总算摸清了规律,并且成功了一个case.
Case 1: LaptopA安装了Spark和Openfire, LaptopB安装了Spark.
接收方可以收到语音聊天邀请,但Accept后,发送方或者接收方最后会提示"Session closed due to Closed Remotely"或者"Voice chat ended: No Media Received. This may be caused by firewall configuration problems."
在网上发现很多人也遇到过这样的问题, 但至今没有答案, 而且我将firewall关闭后还是不行. 分析XMPP packets, 一切都是正常的.
<iq id="fSjYO-68" to="zhangsan@hj.com/spark" from="lisi@hj.com/spark" type="set"> <jingle xmlns="http://jabber.org/protocol/jingle" initiator="lisi@hj.com/spark" responder="zhangsan@hj.com/spark" action="transport-info" sid="5856340275725448398"> <content name="Audio-Content"> <transport xmlns="http://jabber.org/protocol/jingle/transport/ice"> <candidate generation="1" ip="hj.com" port="16552" network="1" username="1" password="2011457701536237394" preference="0" type="relay"/> </transport> </content> </jingle> </iq> <iq id="XUxSY-71" to="lisi@hj.com/spark" from="zhangsan@hj.com/spark" type="set"> <jingle xmlns="http://jabber.org/protocol/jingle" initiator="lisi@hj.com/spark" responder="zhangsan@hj.com/spark" action="transport-info" sid="5856340275725448398"> <content name="Audio-Content"> <transport xmlns="http://jabber.org/protocol/jingle/transport/ice"> <candidate generation="1" ip="192.168.1.102" port="11294" network="0" username="1" password="5230389440376589888" preference="2195" type="prflx"/> </transport> </content> </jingle> </iq>
Case 2: LaptopA安装了Psi和Openfire, LaptopB安装了Psi.
接收方可以收到语音聊天邀请,但Accept后, 最后发送方会提示"Call was rejected or terminated". 通过分析XMPP packets,发现原来LaptopA的Psi获得的candidates地址是"127.0.0.1", LaptopA当然不能通过这个地址来和LaptopB进行语音聊天了, 原因估计是Openfire也安装在LaptopA. 如果有第三台电脑安装Openfire,估计能成功, 可惜实在不想启动家里那台过时速度极慢的台式机了.
<iq type="set" to="zhangsan@hj.com/A23" id="aac0a" > <jingle xmlns="urn:xmpp:jingle:1" initiator="lisi@hj.com/laptop-hj" action="session-initiate" sid="uIHg21D8Q8UJkWsf" > <content creator="initiator" name="A" senders="both" > <description xmlns="urn:xmpp:jingle:apps:rtp:1" media="audio" > <payload-type id="110" name="SPEEX" clockrate="16000" /> </description> <transport xmlns="urn:xmpp:jingle:transports:ice-udp:1" pwd="dODoWCJnXPqeIneJwCrA28" ufrag="2PAp" /> </content> </jingle> </iq> <iq from="zhangsan@hj.com/A23" type="result" to="lisi@hj.com/laptop-hj" id="aac0a" /> <iq type="set" to="zhangsan@hj.com/A23" id="aac1a" > <jingle xmlns="urn:xmpp:jingle:1" action="transport-info" sid="uIHg21D8Q8UJkWsf" > <content creator="initiator" name="A" > <transport xmlns="urn:xmpp:jingle:transports:ice-udp:1" pwd="dODoWCJnXPqeIneJwCrA28" ufrag="2PAp" > <candidate generation="0" network="0" port="8010" protocol="udp" component="1" foundation="0" ip="127.0.0.1" priority="2130706431" type="host" id="my51NYF8wP" /> <candidate generation="0" network="0" port="8011" protocol="udp" component="2" foundation="0" ip="127.0.0.1" priority="2130706430" type="host" id="LS4DE8k7vO" /> </transport> </content> </jingle> </iq> <iq from="zhangsan@hj.com/A23" type="set" to="lisi@hj.com/laptop-hj" id="aac1a" > <jingle xmlns="urn:xmpp:jingle:1" action="transport-info" sid="uIHg21D8Q8UJkWsf" > <content creator="initiator" name="A" > <transport xmlns="urn:xmpp:jingle:transports:ice-udp:1" pwd="eLRa7cHeUu54G0DsHCss1C" ufrag="Tfvb" > <candidate generation="0" network="0" port="8010" protocol="udp" component="1" foundation="0" ip="192.168.1.102" priority="2130706431" type="host" id="tOKbYm1G9C" /> <candidate generation="0" network="0" port="8011" protocol="udp" component="2" foundation="0" ip="192.168.1.102" priority="2130706430" type="host" id="LYcHQKgbQy" /> </transport> </content> </jingle> </iq> <iq type="result" to="zhangsan@hj.com/A23" id="aac1a" /> <iq from="zhangsan@hj.com/A23" type="result" to="lisi@hj.com/laptop-hj" id="aac1a" /> <iq from="zhangsan@hj.com/A23" type="set" to="lisi@hj.com/laptop-hj" id="aac2a" > <jingle xmlns="urn:xmpp:jingle:1" action="session-terminate" sid="uIHg21D8Q8UJkWsf" > <reason> <gone/> </reason> </jingle> </iq> <iq type="result" to="zhangsan@hj.com/A23" id="aac2a" />
Case 3: Psi和Spark互联
失败. 原来这两者目前支持的transport method不一样,从Case 1和2的XMPP packets可以发现, Spark支持"http://jabber.org/protocol/jingle/transport/ice",而Psi支持"urn:xmpp:jingle:transports:ice-udp:1",搞不懂两者有什么区别. 看来两个不同的IM完全互联也不是那么容易的.
到这里我已经有些灰心了,各种组合都试过了,都不行, Psi和Psi是有希望的,但需要第三台电脑运行Openfire服务器, 有没有其他的服务器,除了Google GTalk服务器, 但Gooelg GTalk目前不是完全按照Jingle来实现, 虽然Jingle是Google提出来的. 按照他们的说法, 等Jingle标准稳定下来后他们会按照Jingle来实现的, 可以参照一篇介绍: http://supermmx.org/blog/20061019_gtalk
放弃了!!!
突然, 想起来了, Jingle的实现其实不需要服务器有什么改动的, 主要是要求客户端的支持. Jingle是利用当前的XMPP协议来作为信令协议(signaling protocol)来建立和协商会话的, 对于这一点, 服务器不需要改动的,因为这个信令协议只不过是扩展IQ packet加个<jingle>. Jingle的关键是如何两个客户端之间建立流通道, 如果有客户端在NAT之后还需要利用ICE协议实现NAT穿越. 既然Jingle基本上不需要服务器的改动, 那么Google GTalk服务器是可以使用的, 于是就有这个成功的case.
Case 4: LaptopA安装了Psi, LaptopB安装了Psi, 都连接到Google GTalk服务器
成功!!!!!万岁!!!!!效果还很不错!!!
Case 5: LaptopA安装了Spark, LaptopB安装了Spark, 都连接到Google GTalk服务器
还是失败. 后面测试打算主要用Psi了, Spark不给力啊, 论坛上那么多问题都没人解答.
评论
4 楼
JasonOldWoo
2014-07-02
原因在于没有一台公网的服务器,或者服务器和客户端都在一个局域网下也行。你可以在笔记本上装个虚机用作服务器。
3 楼
xiao2shiqi
2013-04-05
你好LZ,很钦佩您的领悟能力。
小弟最近也在研究Jingle的语音通信,
客户端是自己开发的,目前在Jingle建立连接上也遇到了很头痛的问题。
不知能否讨论交流一下。
不知能否方面共享下建立连接的代码一看呢?
小弟最近也在研究Jingle的语音通信,
客户端是自己开发的,目前在Jingle建立连接上也遇到了很头痛的问题。
不知能否讨论交流一下。
不知能否方面共享下建立连接的代码一看呢?
2 楼
xiangziwade
2012-01-03
看这个聊天界面截图,感觉你使用的是win7系统。如果是的话,问题应该就在这儿了。好像是因为Jingle的语音是使用jmf(java media framework)开发的,而这个jmf已经很久没更新了,简言之就是不支持win7。之前在网上google到一些解决方案,不过虽然是把jmf本身调通了,但是客户端间的语音通信还是连不上,提示内容也没变。
1 楼
laiyangdeli
2011-02-06
XMPP协议可扩展协议有利有弊啊,除了核心所有客户端都支持外,其他扩展协议很多都是不同的客户端都不能互联,只能同一种客户端互联.
发表评论
-
Android Push Notification
2012-03-22 16:09 1267http://sourceforge.net/projects ... -
使用 XMPP 构建一个基于 web 的通知工具
2011-03-01 10:32 1572http://www.ibm.com/developerwor ... -
Smack 3.2.0 Beta has been released
2011-02-27 20:10 1349大约2个星期前, Smack发布3.2.0 Beta版. 距离 ... -
Jingle XMPP stanza对应的XML schema
2011-02-25 20:22 2918一个典型的Jingle XMPP stanza: <i ... -
GMail add 'voice and video chat' support
2011-02-18 13:32 1952GMail增加对视频聊天的 ... -
Ident协议
2011-02-08 18:06 3387为何要安装 identd ? 曾听过有人形容 id ... -
[原创]使用Smack库实现Google Talk XMPP Extensions - Gmail Notifications (含完整的实现代码以及例子)
2011-02-07 21:39 2641注意: 这里有本人所写的完整的代码, 所以如果要转载, 请征得 ... -
贴个XMPP logs看看Pidgin是如何传输文件的
2011-02-07 20:40 2631zhangsan给lisi发送01.jpg文件. (20:2 ... -
晕, Pidgin在Windows上不支持Voice&Viedo
2011-02-07 20:03 1594从http://pidgin.im/上下载了最新版本2.7.9 ... -
[转]XMPP协议之Socket5 Bytestream文件传输
2011-02-06 21:55 5823From: http://bbs.7boo.com.cn/th ... -
GTALK的运行参数
2011-02-06 21:51 1851/nomutex 同时打开多个Talk。 /forcestar ... -
Smack Jingle库所用的JSTUN库存在的bug
2011-02-06 19:52 4494运行Smack Jingle demo时(http://fis ... -
Google Talk Call Signaling
2011-02-05 22:53 1412http://code.google.com/intl/zh- ... -
关于ejabberd在Windows 7无法启动
2011-02-04 22:13 2282用了Openfire作为XMPP Server后,突然想试试e ... -
XMPP Client
2011-02-04 20:58 1534Spark http://www.igniterealtime ... -
XMPP Server
2011-02-04 20:50 1729Openfire http://www.igniterealt ... -
XEP-0065: SOCKS5 Bytestreams
2011-02-04 15:24 2981SOCKS5 Bytestreams ("S ... -
XEP-0047: In-Band Bytestreams
2011-02-04 14:34 2196In-Band Bytestreams (IBB) http: ...
相关推荐
在Android平台上实现XMPP(Extensible Messaging and Presence Protocol)客户端是一项常见的任务,因为XMPP是一种广泛使用的即时通讯协议,尤其适用于构建实时通信应用,如聊天、视频通话等。本篇文章将深入探讨...
总结,使用Java实现XMPP客户端和服务器,涉及到的知识点包括XMPP协议原理、Java编程、网络通信、XML处理、服务器部署以及客户端UI设计。通过该项目,开发者可以深入理解和实践即时通讯系统的构建,提升相关技能。
XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,广泛应用于即时通讯、在线状态管理和多用户聊天室等场景。在黑莓平台上实现XMPP客户端可以帮助用户与使用相同协议的服务进行交互...
XMPP客户端的核心组件包括以下几个部分: 1. **连接管理**:XMPP客户端需要建立和维护与XMPP服务器的连接。这通常通过使用`XMPPTCPConnection`类来实现,该类负责建立TCP连接,并处理心跳保持、重连策略等。 2. **...
类似于xmpp协议的服务器与客户端代码。具体自己看
c#简单实现xmpp客户端,服务器openfire,可以登录及调试xmpp协议
XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的实时通信协议,广泛应用于即时通讯、VoIP、协作软件等场景。本资源包含了一个名为"smack"的库的源代码,该库是实现XMPP客户端协议的一个流行选择...
XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放标准,广泛用于实时通讯应用,如聊天、文件传输和在线状态通知。 首先,让我们了解XMPP的核心概念。XMPP基于客户端-服务器架构,其中客户端...
总结来说,XMPP客户端开发涉及了网络通信、XML处理、身份验证等多个技术领域,而C语言库如txmpp则为开发者提供了一种实现这些功能的底层工具。在实际项目中,结合合适的开发库和深入的XMPP协议理解,可以构建出高效...
XMPP JINGLE Jar包 可以实现语音聊天功能
在IT行业中,Android版XMPP客户端是一个专门针对Android平台开发的即时通讯应用,它利用了XMPP(Extensible Messaging and Presence Protocol)协议来实现实时的聊天功能。XMPP是一种基于XML的开放标准,广泛应用于...
Psi是为经验丰富的用户设计的跨平台功能强大的XMPP客户端。它使用经典的开发模型,其发行版很少见。 Psi +是Psi XMPP客户端的开发分支。借助滚动发布开发模型,用户可以很快地获得新功能和错误修复。
pandion是支持XMPP的客户端软件,是非常好用的软件资源
XML即时通讯协议(Extensible Messaging and Presence Protocol,简称XMPP)是一种基于XML的开放标准,用于实现实时通讯和在线状态管理。它被广泛应用于即时消息、VoIP、文件传输等领域,尤其在企业级通信解决方案中...
XMPP(Extensible Messaging and Presence Protocol)是一种...总的来说,XMPP结合Speex提供了一种有效且灵活的实现移动设备间语音聊天的方式,同时考虑到各种处理器架构的兼容性,使其在iOS平台上具有广泛的应用前景。
xmpp客户端:psi-0.14-win-setup.exe
通过使用XEP(XMPP Extension Protocols),开发者可以实现更多的功能,如多用户聊天室、语音通话、位置共享等。 为了确保安全,XMPP支持TLS/SSL加密,可以保护通信数据不被窃取。同时,服务器端的身份验证机制也是...
XMPP(Extensible Messaging and Presence Protocol)是一种实时通信协议,常用于实现即时消息、语音和视频通话等功能。在这个“xmpp服务器和android客户端源码”项目中,我们涉及到了XMPP服务器的搭建与Android...
本教程将通过Habber项目,详细解析如何在iOS上创建一个XMPP客户端,实现聊天功能。 首先,我们需要理解XMPP的基本工作原理。XMPP基于TCP/IP连接,采用长连接模式,用户上线后保持与服务器的持续通信,以便实时接收...
总结来说,iOS上的XMPP聊天程序客户端开发涉及到XML解析、网络编程、多线程以及特定的XMPP协议处理。开发者需要理解XMPP协议原理,熟练使用XMPPFramework,以及具备良好的iOS应用设计和优化能力。通过不断实践和学习...