嘿伙计们我正在开展一个项目,我需要在实际的互联网上广播UDP数据包,并在客户端接收它们。目前我正在使用多播套接字在本地局域网上广播数据包。我遇到过这个名为jstunt的项目,用于UDP数据报的NAT遍历,但无法找到任何相关文档,也没有实现。我熟悉Nat Traversal的概念,UDP打孔但面临与上述相同的问题,没有相关的文档和实现。所以任何人都可以请求帮助,并建议其他一些技术来实现这一目标。
答案 0 :(得分:1)
正如另一张海报所提到的,你无法真正“免费”向互联网“广播”一个数据包。如果可能的话,网络很容易成为DOS,并且会产生令人难以置信的拥塞。即使在受控网络中,广播通常也会受到严格控制,以至于它们不会失控。也就是说,也许你真的不需要“广播”这个数据包。
如果您需要在互联网上创建UDP“隧道”,例如P2P软件如何工作,则可以完成。诀窍通常是NAT。你提到你已经熟悉UDP打孔,但无法弄清楚如何使它工作。以下是一些可用于此的Java库:
http://www.masquerade.cz/en/nat-tunel-metodou-udp-hole-punching-v-jazyce-java/ http://ulno.net/projects/jpunch/ http://samy.pl/pwnat/
同时查看UPNP:http://en.wikipedia.org/wiki/Universal_Plug_and_Play
答案 1 :(得分:0)
您的ISP和您的客户不太可能支持UDP广播,更不用说互联网骨干网可能允许或不允许的内容。您需要首先调查。这不是一个编程问题,这是一个可行性问题。
答案 2 :(得分:0)
使用UDP SOCKET实现ITS基本日间服务器实现帮助
客户端
import java.io.*;
import java.net.*;
public class DayTime_Client_Udp
{
public static void main (String[] args) throws IOException
{
String hostname= "localhost";
int port=13;
if ((args.length == 1))
{
hostname=args[0];
}
else if ((args.length==2))
{
hostname=args[0];
port=Integer.parseInt(args[1]);
}
InetAddress host = InetAddress.getByName(hostname);
DatagramSocket socket = new DatagramSocket ();
DatagramPacket packet=new DatagramPacket (new byte[100], 0,host, port);
socket.send (packet);
packet.setLength(100);
socket.receive (packet);
socket.close ();
byte[] data = packet.getData ();
String time=new String(data); // convert byte array data into string
System.out.println(time);
}
}
SERVER
import java.io.*;
import java.net.*;
public class DayTime_Server_Udp
{
public static final int DEFAULT_PORT = 3001;
public static void main (String[] args) throws IOException
{
if (args.length > 1)
{
throw new IllegalArgumentException ("Syntax: DaytimeServer [<port>]");
}
DatagramSocket socket = new DatagramSocket(args.length == 0 ?
DEFAULT_PORT : Integer.parseInt (args[0]));
DatagramPacket packet = new DatagramPacket (new byte[1], 1);
while (true)
{
socket.receive (packet);
System.out.println("Received from: " + packet.getAddress () + ":" +
packet.getPort ());
byte[] outBuffer = new java.util.Date ().toString ().getBytes ();
packet.setData (outBuffer);
packet.setLength (outBuffer.length);
socket.send (packet);
}
}
}
如果需要更多帮助而不是评论,我还有UDP BASD的其他程序,因此它有帮助