Netty接收UDP组播数据

这篇具有很好参考价值的文章主要介绍了Netty接收UDP组播数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

针对多网卡情况,绑定其中的一个网卡,接收UDP组播中的数据。文章来源地址https://www.toymoban.com/news/detail-573511.html

package com.demo.udp;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.InternetProtocolFamily;
import io.netty.channel.socket.nio.NioDatagramChannel;

import java.net.*;
import java.util.Enumeration;

public class UdpReceiver {
    // 组播地址
    private static final String groupIp = "225.1.2.2";
    // 组播端口号
    private static final int groupPort = 1234;
    // 本机地址
    private static final String localIp = "192.168.1.110";


    public static void main(String[] args) {
        // 组播地址
        InetSocketAddress groupAddress = new InetSocketAddress(groupIp, groupPort);

        EventLoopGroup group = new NioEventLoopGroup();

        try {
            NetworkInterface ni = NetworkInterface.getByInetAddress(InetAddress.getByName(localIp));
            Enumeration<InetAddress> addresses = ni.getInetAddresses();

            InetAddress localAddress = null;
            while (addresses.hasMoreElements()) {
                InetAddress address = addresses.nextElement();
                if (address instanceof Inet4Address) {
                    localAddress = address;
                    System.out.println("网络接口名称为:" + ni.getName());
                    System.out.println("网卡接口地址:" + address.getHostAddress());
                }
            }

            Bootstrap bootstrap = new Bootstrap();
            bootstrap.group(group)
                    .channelFactory(new ChannelFactory<NioDatagramChannel>() {
                        @Override
                        public NioDatagramChannel newChannel() {
                            return new NioDatagramChannel(InternetProtocolFamily.IPv4);
                        }
                    })
                    .localAddress(new InetSocketAddress(localAddress, groupPort))
                    .option(ChannelOption.IP_MULTICAST_IF, ni)
                    .option(ChannelOption.IP_MULTICAST_ADDR, InetAddress.getByName(localIp))
                    .option(ChannelOption.SO_REUSEADDR, true)
                    .option(ChannelOption.SO_RCVBUF, 2048 * 1024)
                    .option(ChannelOption.SO_SNDBUF, 1024 * 1024)
                    .handler(new ChannelInitializer<NioDatagramChannel>() {
                        @Override
                        protected void initChannel(NioDatagramChannel ch) throws Exception {
                            ChannelPipeline pipeline = ch.pipeline();
                            pipeline.addLast(new NioEventLoopGroup(), new UdpHandler());

                        }
                    });

            NioDatagramChannel channel = (NioDatagramChannel) bootstrap.bind(groupAddress.getPort()).sync().channel();
            channel.joinGroup(groupAddress, ni).sync();
            channel.closeFuture().await();
        } catch (SocketException e) {
            throw new RuntimeException(e);
        } catch (UnknownHostException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            group.shutdownGracefully();
        }

    }

}

package com.demo.udp;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;

public class UdpHandler extends SimpleChannelInboundHandler<DatagramPacket> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) throws Exception {
        final ByteBuf buf = msg.content();
        int readableBytes = buf.readableBytes();
        byte[] msgData = new byte[readableBytes];
        buf.readBytes(msgData);

        String s = ByteUtil.bytesToHexString(msgData);
        System.out.println("接收到的数据 " + s);
    }
}

package com.demo.udp;


import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;

/**
 * Byte数组转换工具类
 */
public class ByteUtil {


    /**
     * 读取输入流中指定字节的长度
     * <p/>
     * 输入流
     *
     * @param length 指定长度
     * @return 指定长度的字节数组
     */
    public static byte[] readBytesFromTo(byte[] buffer, int from, int length) {
        byte[] sub = new byte[length];
        int cur = 0;
        for (int i = from; i < length + from; i++) {
            if (i >= buffer.length) {
                throw new ArrayIndexOutOfBoundsException("该报文长度不符合要求!");
            }
            sub[cur] = buffer[i];
            cur++;
        }
        return sub;
    }

    /**
     * 转换byte数组为int(小端)
     *
     * @return
     * @note 数组长度至少为4,按小端方式转换,即传入的bytes是小端的,按这个规律组织成int
     */
    public static int bytes2Int_LE(byte[] bytes) {
        if (bytes.length < 4) {
            return -1;
        }
        int iRst = (bytes[0] & 0xFF);
        iRst |= (bytes[1] & 0xFF) << 8;
        iRst |= (bytes[2] & 0xFF) << 16;
        iRst |= (bytes[3] & 0xFF) << 24;

        return iRst;
    }

    /**
     * 转换byte数组为Char(小端)
     *
     * @return
     * @note 数组长度至少为2,按小端方式转换
     */
    public static char bytes2Char_LE(byte[] bytes) {
        if (bytes.length < 2)
            return (char) -1;
        int iRst = (bytes[0] & 0xFF);
        iRst |= (bytes[1] & 0xFF) << 8;

        return (char) iRst;
    }

    /**
     * 转换byte数组为short(小端)
     *
     * @return
     * @note 数组长度至少为2,按小端方式转换
     */
    public static short littleByteToShort(byte[] data) {
        if (data.length != 2) {
            throw new UnsupportedOperationException("the byte length is not 2");
        }
        return ByteBuffer.allocate(data.length).put(data).getShort(0);
    }

    public static int bytes2Int(byte[] data) {
        if (data.length != 4) {
            throw new UnsupportedOperationException("the byte length is not 4");
        }
        return ByteBuffer.allocate(data.length).put(data).getInt(0);
    }

    /**
     * byte数组转换成16进制字符串
     */
    public static String bytesToHexString(byte[] bArray) {
        StringBuffer sb = new StringBuffer(bArray.length);
        String sTemp;
        for (int i = 0; i < bArray.length; i++) {
            sTemp = Integer.toHexString(0xFF & bArray[i]);
            if (sTemp.length() < 2) {
                sb.append(0);
            }
            sb.append(sTemp.toUpperCase());
        }
        return sb.toString();
    }

    /**
     * 16进制转换为字符串
     *
     * @param hex
     * @return
     */
    public static String hexStr2Str(String hex) {
        String hexStr = "";
        String str = "0123456789ABCDEF";
        for (int i = 0; i < hex.length(); i++) {
            String s = hex.substring(i, i + 1);
            if (s.equals("a") || s.equals("b") || s.equals("c") || s.equals("d") || s.equals("e") || s.equals("f")) {
                s = s.toUpperCase().substring(0, 1);
            }
            hexStr += s;
        }

        char[] hexs = hexStr.toCharArray();
        int length = (hexStr.length() / 2);
        byte[] bytes = new byte[length];
        int n;
        for (int i = 0; i < bytes.length; i++) {
            int position = i * 2;// 两个16进制字符 -> 1个byte数值
            n = str.indexOf(hexs[position]) * 16;
            n += str.indexOf(hexs[position + 1]);
            bytes[i] = (byte) (n & 0xff);
        }
        String name = "";
        try {
            name = new String(bytes, "GBK");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return name;
    }

    /**
     * 字符串转换为Ascii
     *
     * @param value
     * @return
     */
    public static String stringToAscii(String value) {
        StringBuffer sbu = new StringBuffer();
        char[] chars = value.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            if (i != chars.length - 1) {
                sbu.append((int) chars[i]).append(",");
            } else {
                sbu.append((int) chars[i]);
            }
        }
        return sbu.toString();
    }

    /**
     * Ascii转换为字符串
     *
     * @param value
     * @return
     */
    public static String asciiToString(String value) {
        StringBuffer sbu = new StringBuffer();
        String[] chars = value.split(",");
        for (int i = 0; i < chars.length; i++) {
            sbu.append((char) Integer.parseInt(chars[i]));
        }
        return sbu.toString();
    }

    public static byte[] int2ByteLe(int res) {
        byte[] targets = new byte[4];

        targets[0] = (byte) (res & 0xff); // 最高位
        targets[1] = (byte) ((res >> 8) & 0xff);
        targets[2] = (byte) (res >> 16 & 0xff);
        targets[3] = (byte) (res >> 24 & 0xff);

        return targets;
    }

}


到了这里,关于Netty接收UDP组播数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Netty的TCP和UDP套接字支持

    Netty 是一个网络通信框架,支持 TCP 和 UDP 两种套接字协议。在 Netty 中,我们可以很方便地创建 TCP 和 UDP 服务器和客户端,通过 Channel 和 ChannelPipeline 进行数据传输和消息处理。 下面分别介绍 Netty 对 TCP 和 UDP 的支持。 Netty 对 TCP 的支持非常完善,提供了一系列的 ChannelHandl

    2024年02月11日
    浏览(40)
  • SpringBoot 2.7 集成 Netty 4 实现 UDP 通讯

    Netty 作为异步通讯框架,支持多种协议。本文将介绍基于 SpringBoot 2.7 整合 Netty 4 实现 UDP 通讯。 netty 版本: 3.1 服务端事务处理器(DemoUdpNettyServerHandler) 代码说明: 这里使用线程池来异步处理事务,提高系统并发性能 3.2 服务端连接类(InitUdpNettyServer) 代码说明: UDP 协议需要使用

    2024年02月03日
    浏览(34)
  • 使用Netty构建TCP和UDP服务器和客户端

    Netty是一个基于Java NIO实现的网络通信框架,提供了高性能、低延迟的网络通信能力。使用Netty构建TCP和UDP服务器和客户端非常简单,下面是一个简单的示例代码: 构建TCP服务器 构建TCP客户端 构建UDP服务器 构建UDP客户端   上述示例代码中,分别定义了一个TCP服务器、TCP客户

    2024年02月16日
    浏览(49)
  • java 发送和接收udp数据 udp数据帧结构

    项目开发中,有个需求是接收udp的组播信息,获取帧并解析其中的内容。之前没有接触过udp的通讯以及数据帧。查阅资料对udp的通讯间的发送与接收实现记录如下。 UDP有三种通讯方式,分别是, 单播 、广播、还有组播。 单播 : 单机与单机之间的通讯 广播 : 当前主机与所在

    2024年02月02日
    浏览(36)
  • netty构建udp服务器以及发送报文到客户端客户端详细案例

    目录 一、基于netty创建udp服务端以及对应通道设置关键 二、发送数据 三、netty中的ChannelOption常用参数说明 1、ChannelOption.SO_BACKLOG 2、ChannelOption.SO_REUSEADDR 3、ChannelOption.SO_KEEPALIVE 4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF 5、ChannelOption.SO_LINGER 6、ChannelOption.TCP_NODELAY 以上代码中

    2024年04月09日
    浏览(79)
  • 网络编程套接字(3)——Java数据报套接字(UDP协议)

    目录 一、Java数据报套接字通信模型 二、UDP数据报套接字编程 1、DatagramSocket         (1)DatagramSocket构造方法         (2)DatagramSocket方法 2、DatagramPacket         (1)DatagramPacket构造方法         (2)DatagramPacket方法 3、InetSocketAddress 三、代码示例:回显服务

    2024年03月12日
    浏览(99)
  • 利用c++基于ffmpeg库接收rtsp视频数据,并利用udp将以RTP协议将数据发送,同时利用udp接收RTP数据包,并基于ffmpeg库播放视频。

    这是两个不同的任务,需要分别实现。 任务一:基于ffmpeg库接收rtsp视频数据,并利用udp将以RTP协议将数据发送。 以下是基于ffmpeg库接收rtsp视频数据,然后使用udp发送RTP协议数据的示例代码: 任务二:利用c++利用udp接收RTP数据包,并基于ffmpeg库播放视频。 以下是利用c++利用

    2024年02月12日
    浏览(47)
  • 网络编程(三)—— UDP(单播、广播、组播)

    UDP协议的特点: 无连接 、不保证传输可靠(可能重复到达、失序、丢失、无字节流控制(数据传输快的会淹没慢的)) UDP传输 UDP 服务端(接收端)的搭建流程 UDP客户端(发送端)的搭建流程 通信流程 sendto 和 recvfrom 这两个函数一般在使用UDP协议时使用 sendto recvfrom 单播就

    2024年02月04日
    浏览(40)
  • Linux网络编程系列之UDP组播

            1、 Linux网络编程系列之网络编程基础         2、 Linux网络编程系列之TCP协议编程         3、 Linux网络编程系列之UDP协议编程         4、 Linux网络编程系列之UDP广播         5、 Linux网络编程系列之UDP组播         6、 Linux网络编程系列之服务器编程——阻塞IO模型

    2024年02月04日
    浏览(47)
  • Java UDP通信详解:单播、广播、组播

    1.UDP是一种无连接、不可靠传输的协议; 2.将数据源IP、目的地IP和端口封装成数据包,不需要建立连接 ; 3.每个数据包的大小限制在64KB内; 4.发送不管对方是否准备好,接收方收到也不确认,故是不可靠的; 5.可以广播发送 ,发送数据结束时无需释放资源,开销小,速度快

    2024年02月02日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包