Netty实战之UDP广播实现

这篇博客详细介绍了如何使用Netty实现一个UDP广播服务器。首先定义了LogEvent消息对象,接着阐述了如何通过编码器将LogEvent转换为DatagramPacket以便在Netty框架中处理。广播器负责读取日志文件并发送到指定地址,解码器则将接收到的DatagramPacket解码为字符串。处理器将LogEvent转化为可读格式输出,监听器确保在广播器启动前开始监听,以确保不丢失任何消息。
摘要由CSDN通过智能技术生成

UDP 广播服务器

UDP 不需要连接,直接向服务器发送连接请求,而不会考虑是否连接成功

首先项目目的是读取本地日志文件,然后一行一行打印出消息

1. 设置 LogEvent

首先设置消息对象 LogEvent

package UDP;

import java.net.InetSocketAddress;

public final class LogEvent {
   
    static final byte SEPARATOR = (byte) ':';

    private final InetSocketAddress source;
    private final String logfile;
    private final String msg;
    private final long received;

    public LogEvent(String logfile, String msg) {
    //用于传出消息的构造函数
        this(null, -1, logfile, msg);
    }
    
	// 用于传入消息的构造函数
    public LogEvent(InetSocketAddress source, long received, String logfile, String msg) {
     
        this.source = source;
        this.logfile = logfile;
        this.msg = msg;
        this.received = received;
    }

    public InetSocketAddress getSource() {
    //返回地址
        return source;
    }

    public String getLogfile() {
    //文件名称
        return logfile;
    }

    public String getMsg() {
     //消息内容
        return msg;
    }

    public long getReceivedTimestamp() {
     //返回时间,是一个长整型数据
        return received;
    }
}

2. 编码器

LogEvent消息类型需要进行转换,才能够被Netty框架处理

因此如何转换消息类型时关键,这里采用DatagramPacket 进行消息的接受,并在Channel中流动

package UDP;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.socket.DatagramPacket;
import io.netty.handler.codec.MessageToMessageEncoder;
import io.netty.util.CharsetUtil;

import java.net.InetSocketAddress;
import java.util.List;

public class LogEventEncoder extends MessageToMessageEncoder<LogEvent> {
   
    private final InetSocketAddress remoteAddress;

    LogEventEncoder(InetSocketAddress remoteAddress) {
   
        this.remoteAddress = remoteAddress;
    }

    @Override
    protected void encode(ChannelHandlerContext ctx, LogEvent msg, List<Object> out) throws Exception {
   
        // 将消息内容转为byte类型存储,以待传入byteBuf
        byte[] file = msg.getLogfile().getBytes(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值