2011-04-24 61 views
1

嘿,我正在开发一个项目,我需要在实际的互联网上广播一个UDP数据包,并在客户端接收它们。目前我正在使用多播套接字在本地局域网上广播数据包。我遇到了一个名为jstunt的项目,用于NAT数据报穿越,但无法找到任何相关文档,也没有实现。我熟悉Nat Traversal,UDP打孔的概念,但是面临着与上述相同的问题,没有相关的文档和实现。所以任何人都可以请帮助,并建议一些其他技术来实现这一点。在java中需要关于udp套接字编程的帮助

+1

你确定你需要广播的东西到整个互联网?除非你告诉我我的杀毒软件已经过时,我现在需要点击更新,我不想看到它! – corsiKa 2011-04-24 04:42:52

回答

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

而且特技库:http://nutss.gforge.cis.cornell.edu/stunt.php

+0

谢谢你。我正在浏览您的第二个链接,并发现它很有用。 – anonymous123 2011-04-24 06:24:21

0

你的ISP和你的客户很少会支持UDP广播,更不用说互联网骨干网可能允许或不允许的内容了。您需要首先调查这不是一个编程问题,这是一个可行性问题。

+0

同意,即使你可以摆脱自然,这就像你会走。您需要一个连接的套接字将消息传输到其他网络,此时套接字的末端可以再次广播。 – MeBigFatGuy 2011-04-24 04:38:19

0

ITS全天基本时间服务器实现使用UDP SOCKET它的帮助你

CLIENT

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); 
    } 
} 

服务器

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所以它的帮助UU