Android 如何使用从STUN服务器返回的ip和端口
希望你有一个愉快的一天。我正在构建一个视频通话应用程序,使用XMPP和叮当声以及直接的ByTestStream从一个电话到另一个电话。为了做到这一点,我注意到我需要一个stun服务器来获取android设备的公共ip和端口,并将它们发送给另一方,我像这样获取公共ipAndroid 如何使用从STUN服务器返回的ip和端口,android,xmpp,stun,turn,jingle,Android,Xmpp,Stun,Turn,Jingle,希望你有一个愉快的一天。我正在构建一个视频通话应用程序,使用XMPP和叮当声以及直接的ByTestStream从一个电话到另一个电话。为了做到这一点,我注意到我需要一个stun服务器来获取android设备的公共ip和端口,并将它们发送给另一方,我像这样获取公共ip InetAddress address = Inet4Address.getByName("stun.l.google.com"); MessageHeader sendMH = new Mes
InetAddress address = Inet4Address.getByName("stun.l.google.com");
MessageHeader sendMH = new
MessageHeader(MessageHeader.MessageHeaderType.BindingRequest);
ChangeRequest changeRequest = new ChangeRequest();
sendMH.addMessageAttribute(changeRequest);
byte[] data = sendMH.getBytes();
DatagramSocket s = new DatagramSocket(null);
localPort = s.getLocalPort();
s.setReuseAddress(true);
// s.bind(address);
DatagramPacket p = new DatagramPacket(data,
data.length,address,19302);
s.send(p);
DatagramPacket rp;
rp = new DatagramPacket(new byte[32], 32);
s.receive(rp);
MessageHeader receiveMH = new MessageHeader(MessageHeader.MessageHeaderType.BindingResponse);
// System.out.println(receiveMH.getTransactionID().toString() + "Size:"
// + receiveMH.getTransactionID().length);
receiveMH.parseAttributes(rp.getData());
MappedAddress ma = (MappedAddress) receiveMH
.getMessageAttribute(MessageAttribute.MessageAttributeType.MappedAddress);
ip = ma.getAddress().toString();
port = ma.getPort();
Log.i("XMPP-Stabler",ma.getAddress().toString()+" "+ma.getPort());
s.close();
}catch (Exception e){
e.printStackTrace();
}
然后我将结果发送给另一方,并使用给定的端口在此客户端上打开一个SocketServer,但仍然无法通过internet连接到此服务器Socket,或者可能我做错了什么?你能帮助我如何使用眩晕或转身结果吗?谢谢
这是我的叮当声连接的一面,以防万一
otherTransport = (JingleS5BTransport)
jingle.getContents().get(0).getTransport();
ArrayList<JingleContent> contents = new ArrayList<>();
contents.add(content);
session = (JingleS5BTransportSession) JingleS5BTransportManager.getInstanceFor(connection).transportSession(new JingleSession(connection.getUser(),responderFullId,role,sessionId,contents) {
@Override
public XMPPConnection getConnection() {
return connection;
}
@Override
public void onTransportMethodFailed(String namespace) {
Log.i("XMPP-Stabler","transport method failed "+namespace);
}
});
session.setTheirProposal(otherTransport);
session.initiateOutgoingSession(new JingleTransportInitiationCallback() {
@Override
public void onSessionInitiated(BytestreamSession bytestreamSession) {
Log.i("XMPP-Stabler","ON SESSION INITIATED 2!");
Socks5BytestreamSession session = (Socks5BytestreamSession) bytestreamSession;
}
@Override
public void onException(Exception e) {
e.printStackTrace();
}
});
otherTransport=(JingleS5BTransport)
gingle.getContents().get(0.getTransport();
ArrayList contents=新的ArrayList();
内容。添加(内容);
session=(JingleS5BTransportSession)JingleS5BTransportManager.getInstanceFor(connection).transportSession(新的JingleSession(connection.getUser(),responderFullId,role,sessionId,contents){
@凌驾
公共XMPPConnection getConnection(){
回路连接;
}
@凌驾
公共无效onTransportMethodFailed(字符串命名空间){
Log.i(“XMPP Stabler”,“传输方法失败”+名称空间);
}
});
session.setTheirProposal(其他交通工具);
session.initiateOutgoingSession(新的JingletTransportInitiationCallback(){
@凌驾
已启动公用void onSession(ByTestStreamSession ByTestStreamSession){
Log.i(“XMPP Stabler”,“会话启动时2!”);
Socks5BytestreamSession=(Socks5BytestreamSession)bytestreamSession;
}
@凌驾
公共无效OneException(例外e){
e、 printStackTrace();
}
});
您缺少打孔步骤。为了建立连接,P2P连接的两个端点都需要进行STUN和打孔。但是打孔不适用于大多数用户都在使用的对称NAT,对吗?对称NAT已知很低(如果你有对称NAT,你将需要一个中继(TURN)服务器,除非您有端口预测或uPNP之类的功能。您可以使用STUN服务器检测您所使用的NAT类型。呃,我知道uPNP依赖于路由器,所以不可靠,但是端口预测?如何实现?可靠吗?