Пакет многоадресной дейтаграммы не получен - PullRequest
0 голосов
/ 28 сентября 2018

Я запускаю программу обмена сообщениями с сервером и клиентами на одном хосте (Mac Pro PC).Одноадресное соединение между сервером и клиентом работает, как и ожидалось, на одном хосте.Клиент отправляет сообщение на сервер через одноадресное соединение.Сервер отправляет сообщение на многоадресный адрес.Клиенты прослушивают многоадресный адрес и предполагают получить сообщение от сервера.

Многоадресное соединение не работает должным образом. Сервер отправляет сообщение без каких-либо исключений, но клиенты не получают сообщение через многоадресную передачу.Вот фрагмент кода для отправителя и получателя.

public interface SocketMessengerConstants 
{   
// address for multicast datagrams
public static final String MULTICAST_ADDRESS = "239.0.0.1";

// port for listening for multicast datagrams
public static final int MULTICAST_LISTENING_PORT = 5555;

// port for sending multicast datagrams
public static final int MULTICAST_SENDING_PORT = 5554; 
......   

public class MulticastSender implements Runnable
{   
  private byte[] messageBytes; // message data

  public MulticastSender( byte[] bytes ) 
  {  
   messageBytes = bytes; // create the message
  } // end MulticastSender constructor

   // deliver message to MULTICAST_ADDRESS over DatagramSocket
  public void run() 
  {  
   try // deliver message
   {         
     // create DatagramSocket for sending message
     DatagramSocket socket = 
        new DatagramSocket( MULTICAST_SENDING_PORT );

     // use InetAddress reserved for multicast group
     InetAddress group = InetAddress.getByName( MULTICAST_ADDRESS );

     // create DatagramPacket containing message
     System.out.println(messageBytes.length);
     DatagramPacket packet = new DatagramPacket( messageBytes, 
        messageBytes.length, group, MULTICAST_LISTENING_PORT );

     socket.send( packet ); // send packet to multicast group
     socket.close(); // close socket
    } // end try
    catch ( IOException ioException ) 
    { 
     ioException.printStackTrace();
    } // end catch
  } // end method run
} // end class MulticastSender


public class PacketReceiver implements Runnable 
{
 private MessageListener messageListener; // receives messages
 private MulticastSocket multicastSocket; // receive broadcast messages
 private InetAddress multicastGroup; // InetAddress of multicast group
 private boolean keepListening = true; // terminates PacketReceiver

 public PacketReceiver( MessageListener listener ) 
 {
  messageListener = listener; // set MessageListener

  try // connect MulticastSocket to multicast address and port 
  {
     // create new MulticastSocket
     multicastSocket = new MulticastSocket(
        MULTICAST_LISTENING_PORT );

     // use InetAddress to get multicast group
     multicastGroup = InetAddress.getByName( MULTICAST_ADDRESS );

     // join multicast group to receive messages
     multicastSocket.joinGroup( multicastGroup ); 

     // set 5 second timeout when waiting for new packets
     multicastSocket.setSoTimeout( 5000 );
   } // end try
   catch ( IOException ioException ) 
   {
     ioException.printStackTrace();
   } // end catch
  } // end PacketReceiver constructor

 // listen for messages from multicast group 
 public void run() 
 {          
  // listen for messages until stopped
  while ( keepListening ) 
  {
     // create buffer for incoming message
     byte[] buffer = new byte[ MESSAGE_SIZE ];

     // create DatagramPacket for incoming message
     DatagramPacket packet = new DatagramPacket( buffer, 
        MESSAGE_SIZE );

     try // receive new DatagramPacket (blocking call)
     {            
        multicastSocket.receive( packet ); 
     } // end try
     catch ( SocketTimeoutException socketTimeoutException ) 
     {
        continue; // continue to next iteration to keep listening
     } // end catch
     catch ( IOException ioException ) 
     {
        ioException.printStackTrace();
        break;
     } // end catch

     // put message data in a String
     String message = new String( packet.getData() );

     message = message.trim(); // trim whitespace from message
     System.out.println(message);

     // tokenize message to retrieve user name and message body
     StringTokenizer tokenizer = new StringTokenizer( 
        message, MESSAGE_SEPARATOR );

     // ignore messages that do not contain a user 
     // name and message body
     if ( tokenizer.countTokens() == 2 ) 
     {
        // send message to MessageListener
        messageListener.messageReceived( 
           tokenizer.nextToken(), // user name
           tokenizer.nextToken() ); // message body
     } // end if
   } // end while

   try 
   {
     multicastSocket.leaveGroup( multicastGroup ); // leave group
     multicastSocket.close(); // close MulticastSocket
   } // end try
   catch ( IOException ioException )
   { 
     ioException.printStackTrace();
   } // end catch
} // end method run

......
} // end class PacketReceiver

Функция многоадресной передачи была отключена на маршрутизаторе.Я снял флажок «Отключить IGMP Proxying» от шлюза маршрутизатора.Но многоадресный пакет дейтаграмм все еще не получен.

Обновление: программа находилась за брандмауэром.После того, как брандмауэр разрешает входящие соединения, все работает как положено.

...