один и тот же сервер прослушивает разные сокеты

У меня есть многоадресный сервер UDP, прослушивающий 2 сокета на 2 разных портах. Я добился прослушивания этих двух сокетов от клиентов. Но я хочу определить, на какой сокет клиент отправляет пакет. Поскольку моя проблема в том, что ; на сервере, если я слушаю сокет (9999) и если клиент отправляет через сокет (8888), то на стороне сервера я хочу, чтобы он определял, с какого порта входящий пакет.

public class MulticastReceiver 
{
  public static void main(String[] args)
  {
      MulticastSocket socket = null;
      DatagramPacket packet  = null;

      MulticastSocket soc = null;
      byte[] inBuf = null;
      try
      {
          socket = new MulticastSocket(8888);
          soc = new MulticastSocket(9999);

          InetAddress address = InetAddress.getByName("224.2.2.3");
          socket.joinGroup(address);
          soc.joinGroup(address);

          System.out.println("224.2.2.3 ready to receive packets");
          while(true)
          {
              inBuf=new byte[256];

              packet = new DatagramPacket(inBuf,inBuf.length);
              System.out.println("port is: "+ packet.getAddress() + packet.getPort());
              if(packet.getPort() == 9999) 
              {
                  soc.receive(packet);
              //System.out.println("Data at 224.2.2.3:: " + new String(packet.getData()));
              }
              else
                  socket.receive(packet);

              System.out.println("Data at 224.2.2.3:: " + new String(packet.getData()));
          }
      }
      catch(Exception e)
      {

      }


  }
}





public class MulticastSender {
  public static void main(String[] args) {
    DatagramSocket socket = null;
    DatagramPacket outPacket = null;
    byte[] outBuf;
    final int PORT = 8888;

    try {
      socket = new DatagramSocket();
      long counter = 0;
      String msg;

        msg = "This is multicast! ";

        outBuf = msg.getBytes();

        //Send to multicast IP address and port
        InetAddress address = InetAddress.getByName("224.2.2.3");
        outPacket = new DatagramPacket(outBuf, outBuf.length, address, PORT);

        socket.send(outPacket);

        System.out.println("Server sends : " + msg);
        try {
          Thread.sleep(500);
        } catch (InterruptedException ie) {
        }

    } catch (IOException ioe) {
      System.out.println(ioe);
    }
  }
}




public class AnotherSender {
  public static void main(String[] args) {
    DatagramSocket socket = null;
    DatagramPacket outPacket = null;
    byte[] outBuf;
    final int PORT = 9999;

    try {
      socket = new DatagramSocket();
      long counter = 0;
      String msg;

        msg = "This is another multicast! " + counter;
        counter++;
        outBuf = msg.getBytes();

        //Send to multicast IP address and port
        InetAddress address = InetAddress.getByName("224.2.2.3");
        outPacket = new DatagramPacket(outBuf, outBuf.length, address, PORT);

        socket.send(outPacket);

        System.out.println("Server sends : " + msg);
        try {
          Thread.sleep(500);
        } catch (InterruptedException ie) {
        }

    } catch (IOException ioe) {
      System.out.println(ioe);
    }
  }
}

person sohanarg34    schedule 15.11.2013    source источник


Ответы (1)


Ваш код не имеет смысла. У пакета вообще не будет номера порта, пока вы его не поместите в него или receive(), и в лучшем случае он будет просто считываться попеременно между двумя сокетами, блокируя каждый раз, возможно навсегда, получение из одного сокета и, таким образом, голодая другой.

Вам нужен принимающий поток для каждого неблокирующего сокета.

person user207421    schedule 16.11.2013
comment
@RemyLebeau Меня даже не впечатлило твое бессмысленное редактирование. - person user207421; 16.11.2013
comment
Я не пытался произвести на тебя впечатление. - person Remy Lebeau; 17.11.2013
comment
@RemyLebeau Скажем так. Мое первоначальное утверждение было слишком расплывчатым, поскольку в нем не было указано «неблокирующий». Ваше редактирование ухудшило ситуацию, подразумевая, что оно применяется не только ко всем сокетам, но и ко всем портам. - person user207421; 25.11.2013