java - 同一服务器监听不同的套接字

标签 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);
    }
  }
}

最佳答案

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

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

关于java - 同一服务器监听不同的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20012674/

相关文章:

java - 无法在 android studio 中运行的服务内运行 DevicePolicyManger (deviceManger)

c++ - Winsock - 在 C++ 中从 Java 客户端读取整数

c - 套接字描述符在调用 recvfrom 后更改

java - 从jsp调用Web服务

java - 简单的 CMS 功能,例如 WordPress

java - Lucene 搜索结果按自定义顺序列表排序(每个用户唯一)

java - 了解如何在读取套接字数据(InputStream)时检测断开连接

python - 如何清空python中的套接字?

c - "<>"缺失有什么问题

c - 如何在C中使用UDP监听数据包?