Android 如何使用从STUN服务器返回的ip和端口

Android 如何使用从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

希望你有一个愉快的一天。我正在构建一个视频通话应用程序,使用XMPP和叮当声以及直接的ByTestStream从一个电话到另一个电话。为了做到这一点,我注意到我需要一个stun服务器来获取android设备的公共ip和端口,并将它们发送给另一方,我像这样获取公共ip

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依赖于路由器,所以不可靠,但是端口预测?如何实现?可靠吗?