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(