- 浏览: 1501697 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (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
运行Smack Jingle demo时(http://fisheye.igniterealtime.org/browse/~raw,r=11613/smack/trunk/jingle/extension/source/org/jivesoftware/smackx/jingle/mediaimpl/demo/Demo.java)总会遇到下面的异常:
可以发现是所使用的JSTUN库出了问题. JSTUN位于http://jstun.javawi.de/. 于是下载了jstun-0.7.3.src.tar.gz, 运行其中的de.javawi.jstun.test.demo.ice.ICENegociator, 还是有同样的问题:
经过调试,发现了原因.
ICENegociator类的gatherCandidateAddresses()方法是用来收集candidates地址的, 它首先获取local地址,作为host candidate,然后从这个地址向指定的STUN服务器发送STUN请求,获取server reflexive candidate address. 对于这些地址都会创建一个Candidate对象. 在Candidate类的构造函数里问题出现了, 先看Candidate构造函数:
在Candidate类的构造函数里,会创建一个DatagramSocket, DatagramSocket构造函数的第二参数是socket要绑定的local address. 对于host candidate, DatagramSocket的创建没有问题,因为host candidate就是local address; 但对于server reflexive candidate address, 问题出现了, 因为这个地址是NAT转换后的地址, socket无法绑定上去的.
所以改动如下, 判断CandidateType, 如果是ServerReflexive, 则不创建socket.主要的代码为:
java.net.BindException: Cannot assign requested address: Cannot bind at java.net.PlainDatagramSocketImpl.bind0(Native Method) at java.net.PlainDatagramSocketImpl.bind(Unknown Source) at java.net.DatagramSocket.bind(Unknown Source) at java.net.DatagramSocket.<init>(Unknown Source) at java.net.DatagramSocket.<init>(Unknown Source) at de.javawi.jstun.test.demo.ice.Candidate.<init>(Candidate.java:44) at de.javawi.jstun.test.demo.ice.ICENegociator.gatherCandidateAddresses(ICENegociator.java:87) at org.jivesoftware.smackx.jingle.nat.ICEResolver.initialize(ICEResolver.java:81) at org.jivesoftware.smackx.jingle.nat.TransportResolver.initializeAndWait(TransportResolver.java:387) at org.jivesoftware.smackx.jingle.nat.ICETransportManager.<init>(ICETransportManager.java:36) at com.haojie.smack.demo.Demo.initialize(Demo.java:84) at com.haojie.smack.demo.Demo.<init>(Demo.java:76) at com.haojie.smack.demo.Demo.main(Demo.java:170)
可以发现是所使用的JSTUN库出了问题. JSTUN位于http://jstun.javawi.de/. 于是下载了jstun-0.7.3.src.tar.gz, 运行其中的de.javawi.jstun.test.demo.ice.ICENegociator, 还是有同样的问题:
java.net.BindException: Cannot assign requested address: Cannot bind at java.net.PlainDatagramSocketImpl.bind0(Native Method) at java.net.PlainDatagramSocketImpl.bind(Unknown Source) at java.net.DatagramSocket.bind(Unknown Source) at java.net.DatagramSocket.<init>(Unknown Source) at java.net.DatagramSocket.<init>(Unknown Source) at de.javawi.jstun.test.demo.ice.Candidate.<init>(Candidate.java:44) at de.javawi.jstun.test.demo.ice.ICENegociator.gatherCandidateAddresses(ICENegociator.java:89) at de.javawi.jstun.test.demo.ice.ICENegociator.main(ICENegociator.java:176)
经过调试,发现了原因.
ICENegociator类的gatherCandidateAddresses()方法是用来收集candidates地址的, 它首先获取local地址,作为host candidate,然后从这个地址向指定的STUN服务器发送STUN请求,获取server reflexive candidate address. 对于这些地址都会创建一个Candidate对象. 在Candidate类的构造函数里问题出现了, 先看Candidate构造函数:
public Candidate(Address address, short componentId) throws SocketException, UnknownHostException, UtilityException { this.socket = new DatagramSocket(0, address.getInetAddress()); this.type = CandidateType.Local; this.componentId = componentId; this.priority = 0; this.base = this; this.isInUse = false; } public Candidate(Address address, CandidateType type, short componentId, Candidate base) throws SocketException, UnknownHostException, UtilityException { this.socket = new DatagramSocket(0, address.getInetAddress()); this.type = type; setComponentId(componentId); this.priority = 0; this.base = base; this.isInUse = false; }
在Candidate类的构造函数里,会创建一个DatagramSocket, DatagramSocket构造函数的第二参数是socket要绑定的local address. 对于host candidate, DatagramSocket的创建没有问题,因为host candidate就是local address; 但对于server reflexive candidate address, 问题出现了, 因为这个地址是NAT转换后的地址, socket无法绑定上去的.
所以改动如下, 判断CandidateType, 如果是ServerReflexive, 则不创建socket.主要的代码为:
public class DiscoveryInfo { ....... private int publicPort; // 用于保存NAT转换后的端口 public int getPublicPort() { return publicPort; } public void setPublicPort(int publicPort) { this.publicPort = publicPort; } ...... } public class ICENegociator { ....... public void gatherCandidateAddresses() { ...... DiscoveryTest test = new DiscoveryTest(iaddress, stunServer, stunPort); DiscoveryInfo di = test.test(); if (di.getPublicIP() != null) { Candidate cand = new Candidate(new Address(di.getPublicIP().getAddress()), CandidateType.ServerReflexive, componentId, local); cand.setPort(di.getPublicPort()); ...... } } ...... } public class DiscoveryTest { private boolean test1() throws UtilityException, SocketException, UnknownHostException, IOException, MessageAttributeParsingException, MessageHeaderParsingException { ...... di.setPublicIP(ma.getAddress().getInetAddress()); di.setPublicPort(ma.getPort()); ...... } } public class Candidate implements Comparable { ...... private int port; public Candidate(Address address, CandidateType type, short componentId, Candidate base) throws SocketException, UnknownHostException, UtilityException { if (type == CandidateType.Local) { this.socket = new DatagramSocket(0, address.getInetAddress()); this.address = null; } else { this.address = address; this.socket = null; } this.type = type; setComponentId(componentId); this.priority = 0; this.base = base; this.isInUse = false; } public Address getAddress() throws UtilityException { if (type == CandidateType.Local) { return new Address(socket.getLocalAddress().getAddress()); } else { return this.address; } } public int getPort() { if (type == CandidateType.Local) { return socket.getLocalPort(); } else { return this.port; } } public void setPort(int port) { this.port = port; } }
发表评论
-
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 2630zhangsan给lisi发送01.jpg文件. (20:2 ... -
晕, Pidgin在Windows上不支持Voice&Viedo
2011-02-07 20:03 1593从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 ... -
Google Talk Call Signaling
2011-02-05 22:53 1412http://code.google.com/intl/zh- ... -
几种XMPP客户端实现Jingle语音聊天的总结
2011-02-05 20:48 30890XMPP客户端除了最基本的发送/接收消息,显示好友列表等功能外 ... -
关于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 1728Openfire 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: ...
相关推荐
Smack库是一个强大的开源Java库,专门用于实现XMPP(Extensible Messaging and Presence Protocol)协议。XMPP是一种基于XML的即时通讯协议,广泛应用于聊天应用、协作系统和物联网设备之间的实时通信。Smack库简化...
Smack是一个开源的Java库,专门用于XMPP(Extensible Messaging and Presence Protocol)协议的实现。这个库使得开发者能够轻松地在Java应用中构建实时通信功能,如即时消息、在线状态管理和多用户聊天。"smack_4_1_...
Smack是一个开源的Java库,专为实现XMPP(eXtensible Messaging and Presence Protocol)协议而设计,用于构建即时通讯(IM)应用。它的主要特点是提供简单易用且功能强大的API,使得开发者可以快速地构建聊天和消息...
在"websocket+smack+openfire的的lib"压缩包中,"lib"目录下通常包含了这些技术所需的库文件,包括 WebSocket 的实现库、Smack 的 JAR 包以及可能的 OpenFire 相关依赖。这些库文件是开发和运行基于 WebSocket、...
Smack 是一个开源的、跨平台的即时通讯(IM)库,专为实现XMPP(Extensible Messaging and Presence Protocol)协议而设计。在Smack 4.3.1版本中,开发者能够利用这个强大的框架为Android移动端构建高效、安全的聊天...
Smack库中的org.jivesoftware.smack.packet包提供了封装了消息、存在和IQ(信息查询)类型的数据结构。开发者可以通过Chat和GroupChat类来自动创建和发送这些信息包,也可以直接操作XML信息包。 以下是一个修改在线...
1. **smack.jar**:这是Smack库的基础组件,包含了实现基本XMPP连接、会话管理、消息发送与接收等功能的类和接口。 2. **smackx.jar**:扩展了Smack的基本功能,支持如MUC(多用户聊天)、文件传输、私聊、表情等...
Smack 是一个开源的即时通讯库,主要用于实现XMPP(Extensible Messaging and Presence Protocol)协议。在Android平台上,开发者常使用Smack来构建聊天应用程序,因为它提供了丰富的API和功能,可以方便地创建...
Smack是一款开源的XMPP(Extensible Messaging and Presence Protocol)客户端库,用于构建实时通讯应用。最新的版本是Smack_4_1_6,这个版本包含了几个关键组件和文档,帮助开发者更好地理解和使用该库。 首先,...
Smack是一个开源的XMPP(eXtensible Messaging and Presence Protocol)库,广泛用于实现即时通讯和在线状态功能。在Android平台上,以往开发者通常需要使用Asmack,一个专门为Android优化的Smack版本,因为原版...
Smack是一个开源的Java库,专门用于实现XMPP(Extensible Messaging and Presence Protocol)协议,这是一种基于XML的即时通讯协议,广泛应用于聊天、文件传输、实时通信等多种场景。在这个"smack_接收文件实例"中,...
Smack 是一个开源的XMPP(可扩展消息处理和Presence协议)库,它允许开发者创建可以在XMPP网络上通信的应用程序。最新版本是 Smack_4_1_8,这表明该库已经经过了多次迭代和优化,以提供更稳定、高效的服务。XMPP是一...
Smack是一款开源的XMPP(Extensible Messaging and Presence Protocol)客户端库,用于在Java和Android平台上构建实时通信应用。XMPP是一种基于XML的协议,广泛应用于即时消息、在线状态跟踪以及多用户聊天等场景。...
标题中的"smack4.1.6 java平台需要的jar包"表明这是一组用于Java平台的Smack库的版本4.1.6。Smack是一个开源的XMPP客户端库,用于在Java应用中实现即时通讯(Instant Messaging and Presence Protocol)。它支持多种...
Smack API 是一个开源的Java库,专门用于处理XMPP(可扩展消息处理推送协议)通信。这个API为开发者提供了一套丰富的接口和类,使得构建XMPP客户端应用程序变得简单而高效。它允许用户实现即时通讯(IM)、多用户...
Smack是一个开源的Java库,专门用于实现XMPP(Extensible Messaging and Presence Protocol)协议,这是一种基于XML的即时通讯协议,常用于聊天、文件传输、在线状态管理等场景。"smack4.1 jar"指的是Smack库的4.1...
Smack 4.1.5 是一个开源的Java库,用于实现XMPP(Extensible Messaging and Presence Protocol)协议。XMPP是一种基于XML的实时通信协议,广泛用于即时通讯、在线状态管理和多用户聊天等场景。在Java应用中,Smack库...
这里我们关注的是一个基于Android平台的IM应用示例,它使用了Smack 4.1.4库与Openfire服务器进行通信。让我们深入探讨这个“Android+smack4.1.4+openfire demo”所涉及的知识点。 首先,**Smack** 是一个开源的XMPP...
Smack是Java和Android平台上常用的XMPP客户端库,它提供了丰富的API,使得开发者可以轻松地构建XMPP应用。 **一、环境准备** 在开始之前,确保已经在项目中添加了Smack库的依赖。你可以通过Gradle在build.gradle...