java面试开放性问题及答案,Netty实战二-实现UDP的单播和广播,最终入职阿里

开启客户端发送请求

在开启一个客户端发送请求

四、Netty实现UDP广播

==============

1、LogConst

定义消息常量类,用来模拟日志

/**

  • 作者:DarkKIng

  • 类说明:日志信息,用String数组代替

*/

public class LogConst {

public final static int MONITOR_SIDE_PORT = 9998;

private static final String[] LOG_INFOS = {

“晨光微好,暖在夕阳。幽幽的巷子里,有着岁月酝酿的酒,愈久愈淳。一笔墨香,一盏明灯,记千帆过浪,数不尽的悲欢离合,待那水莲花开。”,

“未来无期,静在安好。一剪寒梅,纷扰了岁月,抚平了伤痕。摆动的双桨,拨动了心的潭水。陌上花开,落一地秋霜,红枫染了红尘,便许了你十里红装。”,

“离别的风,风干了月的泪。夜里的美”,

“是梦的呢喃低语,挥走一片彩云,段落成珠。拂袖离去,乘鹤而来,古道西风瘦马。斑驳的树影中,眉目如画的眼,轻语告别了往事如烟。”,

“无言的殇,几世沧桑,几生悲凉。一起剪了西窗烛,听了夜来风吹雨。昨日的叹息,今日的迷离,执一伞,存了一世一笔的温情。一曲长歌,唱尽了一世繁华,一世缘……”,

“一世恋书,那便十里花开。一生凄凉,那便霜花十里。” ,

“一抹浓烟,便翻页书,展颜一笑,是时间带来遥远的梦。细数树的年轮,感受昨日惆怅,留一半清醒,梦一半叶落。在指尖流过的沙,海边浪花一朵朵,不相遇,才有不约而同。”,

“这世俗,太多牵挂留在心间,一点朱砂泪,一曲相诗歌。岁月朦胧,梦醒了人生,风雨相容,演绎了一段风情。雪亦梦,雨亦梦,万张红纸从天洒来。惊动了山,撼动了天。” +

“一纸情愁,一指烟凉。一相思,一思量,水漫岸头,我们都有着自己不同的三生故事。迎一夜秋风,送一世暖阳,一切冰雪里的花开,是我一生的柔情。” +

“记忆中的短笛,有着清风须来的气息,那时我们面向大海,海风在耳边述说着大海边缘的温暖故事。安好一轮冷月,静好了一残红日,这便是我的语言,我的情丝。” +

“一漫山水,一段情,留在了岁月,拭去了风,晴雨清风,倒是暖阳拂绿草。” +

“这便,晨光微好,花开静好……”};

private final static Random r = new Random();

public static String getLogInfo(){

return LOG_INFOS[r.nextInt(LOG_INFOS.length-1)];

}

}

2、LogMsg

消息实体类

/**

  • 作者:DarkKIng

  • 类说明:日志实体类

*/

public final class LogMsg {

public static final byte SEPARATOR = (byte) ‘:’;

/源的 InetSocketAddress/

private final InetSocketAddress source;

/消息内容/

private final String msg;

/消息id/

private final long msgId;

/消息发送的时间/

private final long time;

//用于传入消息的构造函数

public LogMsg(String msg) {

this(null, msg,-1,System.currentTimeMillis());

}

//用于传出消息的构造函数

public LogMsg(InetSocketAddress source, long msgId,

String msg) {

this(source,msg,msgId,System.currentTimeMillis());

}

public LogMsg(InetSocketAddress source, String msg, long msgId, long time) {

this.source = source;

this.msg = msg;

this.msgId = msgId;

this.time = time;

}

//返回发送 LogMsg 的源的 InetSocketAddress

public InetSocketAddress getSource() {

return source;

}

//返回消息内容

public String getMsg() {

return msg;

}

//返回消息id

public long getMsgId() {

return msgId;

}

//返回消息中的时间

public long getTime() {

return time;

}

}

3、LogEventEncoder

日志编码类

/**

  • 作者:DarkKIng

  • 类说明:编码,将实际的日志实体类编码为DatagramPacket

*/

public class LogEventEncoder extends MessageToMessageEncoder {

private final InetSocketAddress remoteAddress;

//LogEventEncoder 创建了即将被发送到指定的 InetSocketAddress

// 的 DatagramPacket 消息

public LogEventEncoder(InetSocketAddress remoteAddress) {

this.remoteAddress = remoteAddress;

}

@Override

protected void encode(ChannelHandlerContext channelHandlerContext,

LogMsg logMsg, List out) throws Exception {

byte[] msg = logMsg.getMsg().getBytes(CharsetUtil.UTF_8);

//容量的计算:两个long型+消息的内容+分割符

ByteBuf buf = channelHandlerContext.alloc()

.buffer(8*2 + msg.length + 1);

//将发送时间写入到 ByteBuf中

buf.writeLong(logMsg.getTime());

//将消息id写入到 ByteBuf中

buf.writeLong(logMsg.getMsgId());

//添加一个 SEPARATOR

buf.writeByte(LogMsg.SEPARATOR);

//将日志消息写入 ByteBuf中

buf.writeBytes(msg);

//将一个拥有数据和目的地地址的新 DatagramPacket 添加到出站的消息列表中

out.add(new DatagramPacket(buf, remoteAddress));

}

}

4、LogEventBroadcaster

日志广播端

/**

  • 作者:DarkKIng

  • 类说明:日志的广播端

*/

public class LogEventBroadcaster {

private final EventLoopGroup group;

private final Bootstrap bootstrap;

public LogEventBroadcaster(InetSocketAddress remoteAddress) {

group = new NioEventLoopGroup();

bootstrap = new Bootstrap();

//引导该 NioDatagramChannel(无连接的)

bootstrap.group(group).channel(NioDatagramChannel.class)

//设置 SO_BROADCAST 套接字选项

.option(ChannelOption.SO_BROADCAST, true)

.handler(new LogEventEncoder(remoteAddress));

}

public void run() throws Exception {

//绑定 Channel

Channel ch = bootstrap.bind(0).sync().channel();

long count = 0;

//启动主处理循环,模拟日志发送

for (;😉 {

ch.writeAndFlush(new LogMsg(null, ++count,

LogConst.getLogInfo()));

try {

//休眠 2 秒,如果被中断,则退出循环;

Thread.sleep(2000);

} catch (InterruptedException e) {

Thread.interrupted();

break;

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

本文从基础到高级再到实战,由浅入深,把MySQL讲的清清楚楚,明明白白,这应该是我目前为止看到过最好的有关MySQL的学习笔记了,我相信如果你把这份笔记认真看完后,无论是工作中碰到的问题还是被面试官问到的问题都能迎刃而解!

MySQL50道高频面试题整理:

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

解!

MySQL50道高频面试题整理:

[外链图片转存中…(img-0hGpjBzg-1712257128113)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值