java DatagramSocket接收数据 组播Socket发送数据

标签 java sockets networking

任何人都可以向我展示一个 java 示例,用于从 DatagramSocket 接收数据并通过多播套接字发送相同的数据

最佳答案

发送多播数据报

为了在 Java 中发送任何类型的数据报,无论是单播、广播还是多播,都需要一个 java.net.DatagramSocket:

DatagramSocket socket = new DatagramSocket();

可以选择向 DatagramSocket 构造函数提供套接字必须绑定(bind)到的本地端口。仅当需要其他方能够在特定港口联系我们时才需要这样做。第三个构造函数采用本地端口和要绑定(bind)的本地 IP 地址。这(很少)用于多宿主主机,其中接收流量的网络适配器很重要。

 DatagramSocket socket = new DatagramSocket();

byte[] b = new byte[DGRAM_LENGTH];
DatagramPacket dgram;

dgram = new DatagramPacket(b, b.length,
  InetAddress.getByName(MCAST_ADDR), DEST_PORT);

System.err.println("Sending " + b.length + " bytes to " +
  dgram.getAddress() + ':' + dgram.getPort());
while(true) {
  System.err.print(".");
  socket.send(dgram);
  Thread.sleep(1000);
}

接收多播数据报

可以使用普通的 DatagramSocket 来发送和接收单播和广播数据报以及发送多播数据报。然而,为了接收多播数据报,需要一个 MulticastSocket。原因很简单,UDP 以下的所有协议(protocol)层都需要做额外的工作来控制和接收组播流量。

byte[] b = new byte[BUFFER_LENGTH];
DatagramPacket dgram = new DatagramPacket(b, b.length);
MulticastSocket socket =
  new MulticastSocket(DEST_PORT); // must bind receive side
socket.joinGroup(InetAddress.getByName(MCAST_ADDR));

while(true) {
  socket.receive(dgram); // blocks until a datagram is received
  System.err.println("Received " + dgram.getLength() +
    " bytes from " + dgram.getAddress());
  dgram.setLength(b.length); // must reset length field!
}

了解更多信息:

关于java DatagramSocket接收数据 组播Socket发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56866200/

相关文章:

java - Apache DButils 插入/更新列映射?

java - 从数组列表中删除

即使在对等方挂断后,poll() 也能返回 POLLIN 事件吗?

c++ - Boost ASIO async_write_some 真的很慢

java - 这个问题的最佳数据结构?

java - 将字符串转换为 Joda LocalTime 格式 (HH :mm:ss) and Remove milliseconds

java - 在 AsyncTask 中通过套接字接收两个不同的数组

java - 2个线程如何相互通信?

C# Begin/EndReceive - 如何读取大数据?

networking - 网络中的DMZ是什么?