分組

2017-09-25 39 views
0

簡介分組

有上創建組播發布者和接收器的數量的教程。

我用了一個發現here進行了一些修改。

幾個人:

注意,這些教程都是頗爲相似。

詳情:

服務器端口7777運行併發送數據報224.0.0.0(我測試了幾個其他知識產權的的組播範圍:224.0.0.0239.255.255.255,但這些並沒有工作)

然後客戶端加入組播組224.0.0.0並等待響應數據包(如運行一個線程)

額外:我送如:123.23.13.12[host-name]:1234作爲數據報數據。

問題:

從服務器(在本地主機)多播數據包未到達客戶端(在本地主機)。

客戶端在Android模擬器上包含一個Java控制檯應用程序(代碼見下)和Android應用程序。這兩個客戶端都不會收到組播數據包

我知道,組播數據包被髮送,因爲這是在Wireshark

所示下面你會發現這裏面我有一個基本的例子。

TL; DR:服務器發送組播數據包(通過Wireshark確認),但客戶端不接收它們。

建議非常歡迎!

UPDATE

基於Just another Java programmer的評論,我檢查我的防火牆。你瞧,我的防火牆正在下降inputforward鏈。我將此設置爲accept所有傳入(暫時)

根據Ron Maupin的評論。

  • 我已經改變發送到排除的主機名,從而發送的消息是123.12.13.23:1234
  • 我已經改變了的多播發送地址239.254.0.0其在指定的範圍內的消息(見Ron的評論)
  • 的多播端口被設置爲7777
  • 出接口在broadcastServer()try catch塊設定s.setInterface(InetAddress.getLocalHost())

應用這些更改後,客戶端仍然沒有收到任何數據包。

代碼:

服務器端(控制檯應用程序):

String multicastAddress = "239.254.0.0", multicastPort = 7777; 

private void broadcastServer() { 
    String message = null; 
    MulticastSocket s = null; 
    InetAddress local = null, group = null; 
    InetAddress[] allByName; 
    try { 
     local = InetAddress.getLocalHost(); 
     s = new MulticastSocket(multicastPort); 
     s.setReuseAddress(true); 
     s.setInterface(local) 
     s.joinGroup(InetAddress.getByName(multicastAddress)); 
     group = InetAddress.getByName(multicastAddress); 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    MulticastSocket socket = s; 

    // getNetworkIP() gets lan network ip 
    // serverport = 1025 
    message = local.getHostAddress() + ":" + String.valueOf(serverPort); 
    byte[] buf = message.getBytes(); 
    DatagramPacket packet = new DatagramPacket(buf, buf.length, group, multicastPort); 

    thdBroadcaster = new Thread(() -> { 
     while (bRunServer) { 
      try { 
       Thread.sleep(1000); 
       printf("[Broadcast] Broadcasting..."); 
       socket.send(packet); 
       printf("OK\n"); 
       printf(""); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
     socket.close(); 
    }); 
    thdBroadcaster.start(); 
} 

客戶端(控制檯應用程序):

String multicastAddress = "239.254.0.0", multicastPort = 7777; 

private void startServerListenerThread() { 
    Thread thdServerListener = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      MulticastSocket socket = null; 
      InetAddress group = null; 
      try { 
       socket = new MulticastSocket(multicastPort); 
       socket.setReuseAddress(true); 
       group = InetAddress.getByName(multicastAddress); 
       socket.joinGroup(group); 

       handleServerBroadcasts(socket); 
       socket.leaveGroup(group); 
       socket.close(); 

      } catch (UnknownHostException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     private void handleServerBroadcasts(final MulticastSocket socket) { 
      while (true){ 
       try { 
        byte[] buf = new byte[256]; 
        DatagramPacket packet = new DatagramPacket(buf, buf.length); 
        socket.receive(packet); 
        String received = new String(packet.getData()); 

        String address = received.substring(0, received.indexOf(":")); 
        String port = received.substring(received.indexOf(":") + 1); 

        System.out.println(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (Exception x){ 
        x.printStackTrace(); 
       } 
      } 
     } 
    }); 
    thdServerListener.start(); 
} 
+1

您是否檢查過客戶端沒有活動的軟件防火牆? –

+2

首先,'224.0.0.0'是一個保留的多播地址,不能使用。您可能希望在允許的範圍內使用多播地址,並且這將是組織本地範圍的「239.0.0.0」到「239.255.255.255」。接下來,「_I發送如下消息:」123.23.13.12 [host-name]:1234'作爲數據報data_,「是不正確的。這將是一個DNS名稱,不允許在多播中使用。您必須發送如下消息:'123.23.13.12:1234'。 –

+0

另外,您需要指定傳出多播接口。在所有接口上使用相同的多播組,並指定用於多播的接口。 –

回答

-1

該解決方案最終是一個微不足道的變化。

解決的問題是一樣簡單改變:

s = new MulticastSocket(multicastPort); 

s = new MulticastSocket(); 

在服務器端只

注:防火牆是一個要求,檢查組播數據包被允許通過。我使用的接口是localhost,但不是必需的。但是,這可以通過獲取您需要的指定接口來設置。

UPDATE

EJP的評論:

我改變了用來8888的端口。此端口用於發送服務器數據報並用於客戶端連接其MulticastSocket

+0

那麼客戶端如何成功發送多播到端口7777?不可信。 – EJP

+0

查看更新回答 – KGCybeX

-1

您正在調用 綁定套接字。它沒有效果。您需要創建一個未綁定的MulticastSocket,請撥setReuseAddress(),然後綁定它。

+0

感謝您的回答,評論而不是您的答案,儘可能有幫助,並不能解決問題/問題,downvote的原因。 – KGCybeX