分组

2017-09-25 35 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