同一服务器在不同的套接字上侦听

时间:2013-11-15 23:51:04

标签: java sockets udp multicast multicastsocket

我有一个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);
    }
  }
}

1 个答案:

答案 0 :(得分:2)

您的代码没有意义。在你将一个数据包放入其中或receive()之前,该数据包将根本没有端口号,并且最多只能在两个套接字之间交替读取,每次阻塞,可能永远,从一个套接字接收,从而使另一个人挨饿。

每个非阻塞套接字都需要一个接收线程。