2011-04-24 66 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