2011-07-05 23 views
15

Tôi đang lập trình một chương trình mạng trong java và tôi muốn gửi một số Gói tới 255.255.255.255, nhưng không thành công, ngay cả khi tôi gửi chúng đến 192.168.1.255, theo đầu ra của lệnh ifconfig, là địa chỉ quảng bá. Nhưng khi tôi gửi chúng đến IP của người bạn đời của tôi nó hoạt động tốt.Gửi gói dữ liệu đến 255.255.255.255 bởi Java DatagramSocket không thành công

Dưới đây là đoạn code để chương trình của tôi:

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

Tôi đã sử dụng DatagarmSocket và DatagramPacket để làm như vậy, đây là thực hiện của tôi về Mạng:

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

Không ngoại lệ được ném.
Tôi đang ở trong một mạng ad hoc.
Tôi đang sử dụng MAC OS X 10.6 trong khi bạn đời của tôi đang sử dụng kubuntu 11.04. Và đây là kết quả 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 là thiết bị tôi đang sử dụng để kết nối với bạn đời của mình.

Hãy làm cho nó đơn giản, tôi là một newbie :)

Cảm ơn trước.

+0

Hãy hiển thị đầu ra của 'ifconfig'! – ShiDoiSi

+0

Tôi đã mở rộng bài đăng. –

Trả lời

10

Trong khi sử dụng phát sóng bạn cần phải kích hoạt nó

socket.setBroadcast(true); 

Một điều nữa là bạn phải chắc chắn rằng router của bạn được cấu hình đúng nếu hai máy tính là trong hai lưới khác nhau. Các chương trình phát sóng thường theo mặc định không được định tuyến. Hơn nữa nếu bạn có một bộ định tuyến có giao diện không dây và giao diện có dây, các chương trình phát sóng này có thể không hoạt động nếu chương trình phát sóng không được bật (Có thể có phần cứng chuyển tiếp giữa hai giao diện đó theo mặc định).

+0

Tôi đã thêm socket.setBroadcast (true) ngay sau socket.connect (...). Nhưng nó vẫn không hoạt động. Có chuyện gì vậy? –

+0

Tôi mở rộng bài đăng. – fyr

+0

Cảm ơn. Nhưng Không, không có bộ định tuyến. Đó là một mạng ad hoc. Máy tính với máy tính. Nhưng nó không hoạt động. Cách thông thường để phát sóng trong mạng là gì? –

1

Nếu tôi nhớ chính xác, you cannot receive from broadcast-adresses, nhưng chỉ gửi cho họ! Vì vậy, ở phía bên nhận, bạn phải lắng nghe trên "của bạn" IP cụ thể.

+0

Thật sao? Nhưng bằng cách nào ? Tôi nên có một DatagramSocket để gửi và một DatagramSocket để nhận được? Và cả hai trong cùng một cổng? Tôi nghĩ điều đó là không thể. (Tôi nghĩ rằng hệ điều hành sẽ không cho phép chúng tôi có hai ổ cắm với cùng một cổng) –

+0

@ Pro.Hessam, người gửi không phải sử dụng một cổng cụ thể, bất kỳ sẽ làm. – ShiDoiSi

+0

bạn có nghĩa là tôi gửi gói đến cổng 8030 và nhận chúng từ 8027 chẳng hạn? Tôi đã thực hiện một DatagramSocket kết nối với 255.255.255.255 và một DatagramSocket kết nối với localhost một đang sử dụng cổng 8030, khác đang sử dụng cổng 8027. nhưng nó không hoạt động. Có chuyện gì vậy? –

2

192.168.1.255

  • Vui lòng kiểm tra subnet mask trong mạng. Có thể máy của bạn và máy có thể không giống với mạng .
  • Vui lòng kiểm tra máy có tồn tại.
  • nếu nó định tuyến thì tôi không nghĩ như vậy thông báo sẽ được truyền đến đích.
+0

@Karnahire, Tại thời điểm này. Tôi đang gửi các gói tin cho riêng mình. (bằng cách gửi các gói tin đến "192.168.1.255"). Nhưng tôi không thể nhận được chúng. Nhưng khi tôi gửi các gói tin đến "localhost" nó hoạt động tốt. –

+0

Địa chỉ ip 192.168.1.255 phát sóng không hoạt động trong trường hợp cửa sổ và Mac. Tôi không tìm thấy lý do tại sao? – Kamahire

5

Thay vì kết nối DatagramSocket của bạn đến địa chỉ broadcast, chỉ cần xây dựng các DatagramPacket để nhắm mục tiêu nó, ví dụ:

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

Và cũng giống như ma thuật, bạn đã gửi một phát sóng. Và sau đó để nắm bắt nó ở phía bên kia, chỉ cần có kết thúc nghe trên cổng đó:

DatagramSocket dsock = new DatagramSocket(samePortUsedAbove); 
DatagramPacket dp = new DatagramPacket(byteArray, byteArray.length); 
dsock.receive(dp); 
Các vấn đề liên quan