2011-07-05 30 views
15

我正在用java編程一個網絡程序,我想發送一些數據包到255.255.255.255,但是它失敗了,即使我把它們發送到192.168.1.255,根據ifconfig命令的輸出,是廣播地址。但是當我將它們發送給我的隊友的IP時,它工作正常。由Java DatagramSocket失敗發送數據包到255.255.255.255

下面的代碼,以我的程序:

public class StackOverFlow { 
    public static void main(String[] args) { 
     Network net= new Network(); 

     Scanner input= new Scanner(System.in); 
     while(input.hasNext()) 
      net.sendMessage(input.nextLine()); 
    } 
} 

我用DatagarmSocket和DatagramPacket類這樣做,這是我實現網絡的:

class Network { 
DatagramSocket socket; 

public Network() { 
    try { 
     socket = new DatagramSocket(8027); 
     socket.setBroadcast(true); 
     socket.connect(InetAddress.getByName("255.255.255.255"), 8027); 
    } catch (Exception e) { 
     System.err.println("Connection failed. " + e.getMessage()); 
    } 
    listen(); 
} 

public void listen() { 
    new Thread() { 
     public void run() { 
      while (true) { 
       try { 
        byte[] buf = new byte[1000]; 
        DatagramPacket packet = new DatagramPacket(buf, 
          buf.length); 
        socket.receive(packet); 
        String message = new String(buf); 
        System.out.println("Recieved: " + message); 
        if (message.equals("end")) 
         return; 
       } catch (Exception e) { 
        System.err.println(e.getMessage()); 
       } 
      } 
     } 
    }.start(); 
} 

public void sendMessage(String message){ 
    byte[] buf= message.getBytes(); 

    DatagramPacket packet= new DatagramPacket(buf, buf.length); 
    try{ 
     socket.send(packet); 
    }catch(Exception e){ 
     System.err.println("Sending failed. " + e.getMessage()); 
    } 
} 

沒有異常被拋出。
我在一個ad hoc網絡中。
我使用MAC OS X 10.6,而我的伴侶使用kubuntu 11.04。 這裏是使用ifconfig輸出:

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 
inet6 ::1 prefixlen 128 
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
inet 127.0.0.1 netmask 0xff000000 
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280 
stf0: flags=0<> mtu 1280 

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
inet6 fe80::21f:f3ff:fed5:4779%en0 prefixlen 64 scopeid 0x4 
inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255 
ether 00:1f:f3:d5:47:79 
media: autoselect (100baseTX <full-duplex>) status: active 
supported media: autoselect 10baseT/UTP <half-duplex> 10baseT/UTP <full-duplex> 10baseT/UTP  <full-duplex,hw-loopback> 10baseT/UTP <full-duplex,flow-control> 100baseTX <half- duplex> 100baseTX <full-duplex> 100baseTX <full-duplex,hw-loopback> 100baseTX <full-duplex,flow-control> 1000baseT <full-duplex> 1000baseT <full-duplex,hw-loopback> 1000baseT <full-duplex,flow-control> none 

en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
inet6 fe80::21d:4fff:feff:2b4d%en1 prefixlen 64 scopeid 0x5 
inet 213.233.170.97 netmask 0xfffffc00 broadcast 213.233.171.255 
ether 00:1d:4f:ff:2b:4d 
media: autoselect status: active 
supported media: autoselect 

fw0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 2030 
lladdr 00:21:e9:ff:fe:bc:79:b2 
media: autoselect <full-duplex> status: inactive 
supported media: autoselect <full-duplex> 

en2: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
ether 00:1f:f3:b6:2c:be 
media: autoselect status: inactive 
supported media: none autoselect 10baseT/UTP <half-duplex> 

vmnet1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
inet 192.168.149.1 netmask 0xffffff00 broadcast 192.168.149.255 
ether 00:50:56:c0:00:01 

vmnet8: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500 
inet 192.168.73.1 netmask 0xffffff00 broadcast 192.168.73.255 
ether 00:50:56:c0:00:08 

EN0是我使用連接到我的伴侶設備。

請簡單,我是一個新手:)

在此先感謝。

+0

請顯示'ifconfig'的輸出! – ShiDoiSi

+0

我擴展了這篇文章。 –

回答

10

在使用廣播,你需要啓用它

socket.setBroadcast(true); 

另一件事是,你必須確保,如果兩臺計算機是在兩個不同的網路由器是正確的配置。廣播通常默認不路由。此外,如果您的路由器具有無線接口和有線接口,則如果未啓用廣播(可能有默認情況下在這兩個接口之間轉發廣播的硬件),這些廣播可能無法正常工作。

+0

我在socket.connect(...)後面添加了socket.setBroadcast(true)。但它仍然不起作用。有什麼問題? –

+0

我延長帖子。 – fyr

+0

謝謝。但是,不,沒有路由器。這是一個特設網絡。計算機到電腦之一。但它不起作用。 網絡廣播的常規方式是什麼? –

1

如果我沒記錯,you cannot receive from broadcast-adresses,但只發送給他們!所以在接收方面,你必須專門聆聽「你的」IP。

+0

真的嗎?但是如何?我應該有一個DatagramSocket發送和另一個DatagramSocket接收?並且都在同一個端口?我認爲這是不可能的。 (我認爲操作系統不會允許我們有兩個相同的端口) –

+0

@ Pro.Hessam,發件人不必使用特定的端口,任何都可以。 – ShiDoiSi

+0

你的意思是我發送數據包到端口8030並從8027接收他們例如? 我做了一個DatagramSocket連接到255.255.255.255和一個DatagramSocket連接到本地主機一個使用端口8030,其他使用端口8027.但它不工作。有什麼問題? –

2

192.168.1.255

  • 請檢查網絡的子網掩碼。 有可能您的機器 與機器可能不一樣 網絡。
  • 請檢查機器是否存在。
  • 如果它路由器然後我不認爲這樣的消息將被傳輸到目的地。
+0

@Karnahire,在這個時間點。我正在發送數據包給我自己的。 (通過發送數據包到「192.168.1.255」)。但我無法接受他們。但是,當我發送數據包到「本地主機」它工作正常。 –

+0

在Windows和Mac的情況下,IP地址192.168.1.255廣播不起作用。我沒有找到原因? – Kamahire

5

而不是你的DatagramSocket連接到廣播地址,只是構建DatagramPacket的目標是,即

DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length, InetAddress.getByName("255.255.255.255"), yourPortNumber); 

而且像變魔術一樣,你發送一個廣播。然後在另一邊抓住它,只是想聽那個端口:

DatagramSocket dsock = new DatagramSocket(samePortUsedAbove); 
DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length); 
dsock.receive(dp); 
相關問題