- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图通过 NAT 向客户端发送一个 udp 数据包,我们都属于不同的 NAT,我们熟悉 STUN 的理论因此实现这一点的方法是“打洞”我们的通过一个简单的 STUN 服务器..
基本上服务器只返回外部 IP 地址和另一个“已连接”客户端的端口,然后我可以使用它通过 NAT 将数据包发送到客户端...但是尽管我们设法获得了彼此的外部 IP和端口..发送后我们仍然无法收到对方的任何信息...在通过论坛搜索和数小时的挠头之后,我们仍然无法提出解决方案...想知道是否有人熟悉STUN 能够就我们出错的地方给我们一些指示或建议......
下面是我们写的小客户端...
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;
public class Client {
DatagramSocket socket;
public Client(){
try {
socket = new DatagramSocket();
String data = "Initiate Stun Server";
byte[] receive = data.getBytes();
InetAddress host = InetAddress.getByName("the.stun.server.ipaddress");
DatagramPacket pk = new DatagramPacket(receive,receive.length,host,9345);
socket.send(pk); //send packet to server to initiate udp communication
//spawn a new Thread to listen for any incoming packets
new Thread(){
public void run(){
byte[] r;
DatagramPacket rp;
while(true){
System.out.println("Start listening on new socket");
r = new byte[1024];
rp = new DatagramPacket(r,r.length);
try {
socket.receive(rp);
System.out.println(new String(rp.getData()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
String m = JOptionPane.showInputDialog(null,"Enter message to send");
InetAddress connect = InetAddress.getByName(JOptionPane.showInputDialog(null,"Enter address to send message to"));//This is where we input the external ip
int connectPort = Integer.parseInt(JOptionPane.showInputDialog(null,"Enter port of the addressee"));//input port
DatagramPacket p = new DatagramPacket(m.getBytes(),m.getBytes().length,connect,connectPort);
socket.send(p);
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String args[]){
Client c = new Client();
}
}
最佳答案
您实现的不是真正的 STUN 协议(protocol),但可能就足够了。 :)
但我认为我在您的代码中发现了两个问题。
您没有保存本地端口号。从 stun 服务器获得响应后,您需要调用 socket.getLocalPort 以找出与“映射端口”对应的内部端口号。映射端口是您的 stun 服务器看到您的端口。您的 NAT 将继续将出站流量从您的 PC 的 IP 映射到该映射的端口,但前提是您使用相同的本地端口。因此,在您与对等方的后续连接中,在同一端口上创建数据报套接字(在关闭原始套接字之后),或者只是重复使用同一套接字进行与对等方的后续通信,因为套接字已经绑定(bind)。
仅仅因为您知道远程主机的外部 IP 地址及其本地套接字的端口映射,并不意味着他的 NAT 会转发您的数据包。大多数 NAT 运行为“IP 和端口受限”。这意味着如果它知道同一远程主机的 IP 和端口有相应的出站 UDP 数据包,它将只允许入站流量(包括 UDP 数据包)通过 NAT。如果没有这条规则,它就不知道要将数据包转发到 NAT 后面的哪台 PC。典型的 NAT 穿越技术是两个对等体同时向对方发送简单的 1 字节数据报,并反复尝试(不止一次)。第一个数据包试图离开主机并离开它自己的 NAT,但很可能会被远程 NAT 阻止(因为它不知道你是谁)。但是它确实会导致你的NAT创建一个映射和转发条目让对方成功发送给你。最终,两个 NAT 都将允许并转发双方之间的流量。
还有一些类型的 NAT 具有不可预测的端口映射行为。 (端口映射在每个 IP 的基础上发生变化)。这些很难遍历(使用 STUN),但如果另一方有一个表现良好的 NAT,通常可以正常工作。幸运的是,这些类型的 NAT 比以前少见。
这是一些链接:
ICE(通过使用 STUN 和 TURN 的 P2P 标准机制):http://en.wikipedia.org/wiki/Interactive_Connectivity_Establishment
我的 P2P connectivity in a nutshell answer我给了一会儿。
另外,一个明显的插件使用 my STUN server code base .您可以将它与 JStun 结合使用客户端库。
关于使用 DatagramSocket 的 Java UDP STUN 打洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9906706/
我目前正在开发一款在线游戏。在游戏中,需要通过 TCP 和 UDP 将数据从服务器发送到客户端。实现 UDP 打洞很容易,但我不太确定如何实现 TCP 打洞: 服务器:ServerSocket 监听给
我正在尝试使用 mingw 工具链通过 Windows 套接字实现 TCP 打洞。我认为这个过程是正确的,但洞似乎并没有采取。我用了this作为引用。 A 和B 连接到服务器S S 发送给A,B的路由
作者引言 很高兴啊,我们来到了IceRPC之试试的新玩法"打洞",让防火墙哭去吧 试试RPCs的新玩法"打洞" 比较典型的玩法:RPC数据
我目前正在尝试通过 Internet 发送 UDP 消息,并且必须为端点 A 和 B(都位于 NAT 后面)设置防火墙。为此,我想使用 STUN 服务器进行打洞。 当 A 创建对 STUN 服务器的请
实际上,我正在编写一个 Android 应用程序,该应用程序接收连接到电脑的网络摄像头的图片。为了获得更多的 fps,我使用 udp 协议(protocol)而不是 tcp。这个想法是,pc 将图片发
我已经阅读了很多关于如何实现 UDP 打洞的书,但由于某种原因我无法让它工作。 对于那些不熟悉什么是udp打洞的人,这里是我自己的定义: 目标是能够在两个客户端(客户端 A 和客户端 B) 在服务器的
我用 Java 完成了一个在 LAN 范围内运行良好的 P2P 程序,现在我陷入了众所周知的 NAT 穿越问题。我想让我的用户通过 NAT 边界相互连接(我知道不可能 100% 做到这一点)。我已经阅
问题如下。这是我当前没有成功的测试代码。 static void Main(string[] args) { if (args.Count() != 3) { Cons
几周来我一直在尝试创建套接字聊天/文件传输应用程序。我花了几个小时在互联网上搜索一段关于 UDP 打洞的代码,但我没有找到任何有效或足够简单供我使用的代码。 我正在尝试让路由器 (NAT) 后面的两个
我正在做一个客户端-服务器语音聊天程序(非托管 C++,win32),其中客户端使用 TCP 连接到服务器,文本聊天/聊天室功能在 TCP 中完成,而所有音频传输都通过单独的 UDP/RTP 套接字发
stackoverflow 用户! 我有一个必须处理 p2p 的应用程序,这就是我使用 UDP 打洞的方式。但是我在实现时遇到了麻烦。希望你能给我一些提示。 我有服务器,它工作得很好,可以互相介绍客户
我试图用打洞协议(protocol)制作一个服务器客户端。所以我将我的客户端 IP 和客户端端口发送到我的服务器,当第二个用户连接时,服务器向两个客户端发送另一个客户端的 IP 和端口。所以当我有这个
我已经建立了一个网络项目,通过打洞在 LAN 或 WAN 上进行通信。我正在为客户端使用 GCSAsyncUdpSocket。我有一个集合点服务器,它被端口转发,可以从所有传入连接访问。我的设置是这样
我在本地机器上使用以下代码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream
对于我的学术项目,我正在努力实现这一目标。监听端口 3000 的 Web 服务器 Node JS 应用程序。所以如果你 curl http://localhost:3000 你会得到 Hello Wo
我想在具有静态 IP 的服务器的帮助下对两个客户端进行 UDP 打洞。服务器在端口 7070 和 7071 上等待两个客户端。之后,它向对方发送 IP 地址和端口。这部分工作正常。但是我无法在两个客户
我正在尝试使用 hyperswarm我使用 Node.js API 对我 friend 的计算机进行打洞。 但我不知道从哪里获取该方法所需的参数。 node.holepunch(peer, [call
我一直在寻找一个提供可靠性的简单 UDP C++ 库。我刚刚遇到 ENet,它看起来很完美,只是我在文档中找不到对 NAT 打洞的任何支持。网上好像有几个人在讨论这个问题,但是我还没有找到一个明确的答
我试图通过 NAT 向客户端发送一个 udp 数据包,我们都属于不同的 NAT,我们熟悉 STUN 的理论因此实现这一点的方法是“打洞”我们的通过一个简单的 STUN 服务器.. 基本上服务器只返回外
我是否可以使用部署在 AppEngine 上的 servlet 实现通过 TCP 打洞连接的客户端/服务器网络模型? 如果是这样,您如何将连接请求从客户端转发到主机并建立双向连接,一旦启动就消除服务器
我是一名优秀的程序员,十分优秀!