mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-30 02:02:06 +01:00
Multiple STUN Servers Support
git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@7650 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
parent
28be8ecb39
commit
f19bedac1f
2 changed files with 49 additions and 37 deletions
|
@ -33,6 +33,8 @@ import org.jivesoftware.smackx.packet.DiscoverItems;
|
||||||
import org.xmlpull.v1.XmlPullParser;
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* STUN IQ Packet used to request and retrieve a STUN server and port to make p2p connections easier. STUN is usually used by Jingle Media Transmission between two parties that are behind NAT.
|
* STUN IQ Packet used to request and retrieve a STUN server and port to make p2p connections easier. STUN is usually used by Jingle Media Transmission between two parties that are behind NAT.
|
||||||
|
@ -45,8 +47,7 @@ import java.util.Iterator;
|
||||||
*/
|
*/
|
||||||
public class STUN extends IQ {
|
public class STUN extends IQ {
|
||||||
|
|
||||||
private int port = -1;
|
private List<StunServerAddress> servers = new ArrayList<StunServerAddress>();
|
||||||
private String host;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Element name of the packet extension.
|
* Element name of the packet extension.
|
||||||
|
@ -74,39 +75,12 @@ public class STUN extends IQ {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the Host Address
|
* Get a list of STUN Servers recommended by the Server
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public String getHost() {
|
public List<StunServerAddress> getServers() {
|
||||||
return host;
|
return servers;
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the Host Address
|
|
||||||
*
|
|
||||||
* @param host
|
|
||||||
*/
|
|
||||||
public void setHost(String host) {
|
|
||||||
this.host = host;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get STUN port
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public int getPort() {
|
|
||||||
return port;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set STUN port
|
|
||||||
*
|
|
||||||
* @param port
|
|
||||||
*/
|
|
||||||
public void setPort(int port) {
|
|
||||||
this.port = port;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -153,14 +127,19 @@ public class STUN extends IQ {
|
||||||
|
|
||||||
if (eventType == XmlPullParser.START_TAG) {
|
if (eventType == XmlPullParser.START_TAG) {
|
||||||
if (elementName.equals("server")) {
|
if (elementName.equals("server")) {
|
||||||
|
String host = null;
|
||||||
|
String port = null;
|
||||||
for (int i = 0; i < parser.getAttributeCount(); i++) {
|
for (int i = 0; i < parser.getAttributeCount(); i++) {
|
||||||
if (parser.getAttributeName(i).equals("host"))
|
if (parser.getAttributeName(i).equals("host"))
|
||||||
iq.setHost(parser.getAttributeValue(i));
|
host = parser.getAttributeValue(i);
|
||||||
else if (parser.getAttributeName(i).equals("udp"))
|
else if (parser.getAttributeName(i).equals("udp"))
|
||||||
iq.setPort(Integer.parseInt(parser.getAttributeValue(i)));
|
port = parser.getAttributeValue(i);
|
||||||
}
|
}
|
||||||
|
if (host != null && port != null)
|
||||||
|
iq.servers.add(new StunServerAddress(host, port));
|
||||||
}
|
}
|
||||||
} else if (eventType == XmlPullParser.END_TAG) {
|
}
|
||||||
|
else if (eventType == XmlPullParser.END_TAG) {
|
||||||
if (parser.getName().equals(ELEMENT_NAME)) {
|
if (parser.getName().equals(ELEMENT_NAME)) {
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
|
@ -239,4 +218,36 @@ public class STUN extends IQ {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides easy abstract to store STUN Server Addresses and Ports
|
||||||
|
*/
|
||||||
|
public static class StunServerAddress {
|
||||||
|
|
||||||
|
private String server;
|
||||||
|
private String port;
|
||||||
|
|
||||||
|
public StunServerAddress(String server, String port) {
|
||||||
|
this.server = server;
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the Host Address
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getServer() {
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the Server Port
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public String getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -169,7 +169,8 @@ public class STUNResolverTest extends SmackTestCase {
|
||||||
|
|
||||||
System.out.println(STUN.serviceAvailable(getConnection(0)));
|
System.out.println(STUN.serviceAvailable(getConnection(0)));
|
||||||
STUN stun = STUN.getSTUNServer(getConnection(0));
|
STUN stun = STUN.getSTUNServer(getConnection(0));
|
||||||
System.out.println(stun.getHost() + ":" + stun.getPort());
|
for (STUN.StunServerAddress stunServerAddress : stun.getServers())
|
||||||
|
System.out.println(stunServerAddress.getServer() + ":" + stunServerAddress.getPort());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue