java–Android上的UDP打孔; UDP服务器

java–Android上的UDP打孔; UDP服务器,第1张

概述我正在尝试在Android上为我的udp服务器实现udp打孔.事情应该像这样:>客户端(在nat之后;可能是3G,......)向服务器发送DatagramPacket(服务器具有公共IP;端口也称为45555).客户端重复发送具有给定延迟的数据报>一旦服务器收到数据报,它就会每隔500毫秒发回一次数据报(“信号”).>如果打孔工作,客户应

我正在尝试在Android上为我的udp服务器实现udp打孔.事情应该像这样:

>客户端(在nat之后;可能是3G,……)向服务器发送DatagramPacket(服务器具有公共IP;端口也称为45555).客户端重复发送具有给定延迟的数据报
>一旦服务器收到数据报,它就会每隔500毫秒发回一次数据报(“信号”).
>如果打孔工作,客户应该接收这些信号

这是我当前的客户端实现(AndroID):

    //in onCreate()    DatagramSocket socket = new DatagramSocket(46222);    socket.setSoTimeout(2000);    final Thread t = new Thread(new Runnable(){        @OverrIDe        public voID run() {            int delay = Integer.parseInt(e2.getText().toString());//e1 and e2 are EditTexts            String ip = e1.getText().toString();            try {                DatagramPacket packet = new DatagramPacket(new byte[1],1,InetAddress.getByname(ip),45555);                while(!cleanUp){//cleanUp is set to true in onPause()                    lock.lock(); //Lock lock = new reentrantlock();                    socket.send(packet);                    lock.unlock();                    Thread.sleep(delay);                }            } catch (Exception e) {                e.printstacktrace();            }finally{                if(socket!=null)                    socket.close();            }        }    });    final Thread t2 = new Thread(new Runnable(){        @OverrIDe        public voID run() {            try {                Thread.sleep(1000);                DatagramPacket packet = new DatagramPacket(new byte[1],1);                while(!cleanUp){                    lock.lock();                    try{                        socket.receive(packet);                    }catch(SocketTimeoutException e){                        lock.unlock();                        Thread.sleep(15);                        continue;                    }                    lock.unlock();                    final String s = tv.getText().toString()+"signal\n";                    MainActivity.this.runOnUiThread(new Runnable(){                        @OverrIDe                        public voID run() {                            tv.setText(s);//tv is a TextVIEw                        }                    });                    Thread.sleep(10);                }            } catch (Exception e) {                e.printstacktrace();            }            finally{                if(socket!=null)                    socket.close();            }        }    });    //start both threads

这是服务器端实现(Java):

//int static voID main(String[] args):final Thread t = new Thread(new Runnable(){        @OverrIDe        public voID run() {            try {                DatagramPacket packet = new DatagramPacket(new byte[1],addr,port);                DatagramSocket socket = new DatagramSocket();                System.out.println("send");                while(true){                    socket.send(packet);                    Thread.sleep(500);                }            } catch (Exception e) {                // Todo auto-generated catch block                e.printstacktrace();            }        }    });    final Thread t2 = new Thread(new Runnable(){        @OverrIDe        public voID run() {            try {                DatagramPacket packet = new DatagramPacket(new byte[1],1);                DatagramSocket socket = new DatagramSocket(45555);                socket.receive(packet);                addr = packet.getAddress(); //private static fIEld InetAddress addr                port = packet.getPort();                System.out.println(addr+":"+ packet.getPort()); //fIEld int port                t.start();                while(true){                    socket.receive(packet);                    System.out.println("IDle");                }            } catch (Exception e) {                // Todo auto-generated catch block                e.printstacktrace();            }        }    });    t2.start();

当客户端和服务器位于同一个专用网络中时,一切正常.为了模仿公共服务器,我在我的计算机上运行服务器端代码,并在我的路由器上设置一个端口(具有公共IP)*.客户端将其数据包发送到路由器的公共IP.但在这两种情况下(我的智能手机通过我的wlan网络/ 3G或E连接到互联网)没有收到信号(服务器接收客户端的数据报)

那么为什么打孔过程不起作用呢?

问候

*:路由器会将发送到其端口45555的任何udp数据包转发到我的计算机

最佳答案不同的套接字绑定到不同的专用端口,并使用NAT的不同公共端口.您正在通过不同的套接字接收和发送.使用您收到数据的同一套接字发送.否则您的发送套接字使用路由器的不同公共端口将数据发送到您的客户端NAT.您的客户端NAT丢弃的此数据包,因为它来自相同的IP但未知端口. 总结

以上是内存溢出为你收集整理的java – Android上的UDP打孔; UDP服务器全部内容,希望文章能够帮你解决java – Android上的UDP打孔; UDP服务器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1140716.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存