本节主要讲解服务端主启动类 rverbootstrap 的核心 api 的使用。
rverbootstrap 的用法基本上都是固定的,一般对于新接触 netty 的同学来说,会觉得这些模板代码比较多,难以理解。我们主要记住几个核心配置即可。
指定线程模型: 通过.group(bossgroup, workergroup) 给引导类配置两大线程组,这个引导类的线程模型也就定型了。其中 bossgroup 表示监听端口,accept 新连接的线程组;workergroup 表示处理每一条连接的数据读写的线程组;指定 io 模型: 通过.channel(niorversocketchannel.class) 来指定 nio 模型。如果指定 io 模型为 bio,那么这里配置上 oiorversocketchannel.class 类型即可,通常都是使用 nio,因为 netty 的优势就在于 nio;指定处理逻辑: 通过 childhandler () 方法,给这个引导类创建一个 channelinitializer,这里主要就是定义后续每条连接的数据读写,业务处理逻辑;绑定端口号: 调用 bind (80),端口号自定义,不要和其他应用的端口号有冲突即可。说明:客户端和服务端连接之后,会维持一个 channel 通道,可以给其指定逻辑处理器和属性配置;当然,服务端启动的时候它也是一个特殊的 channel 通道。
在开发当中,需要我们去自定义的方法主要是 childhandler () 和 childattr () 这两个。childhandler () 用来绑定业务逻辑器,childattr () 用来设置 channel 属性。比如:绑定用户身份信息。其它方法的使用相对固定,了解即可。
bind () 主要用来绑定本地端口号。
实例:
channelfuture future=rverbootstrap.bind(80);future.addlistener(new genericfuturelistener<fut幽默的笑话ure<? super void>>() { public void operationcomplete(future<? super void> future) { if (future.issuccess()) { system.out.println("端口绑定成功!"); } el { system.err.println("端口绑定失败!"); } }});
代码升级,如果绑定的端口已经存在,则端口号递增。当然,实际情况很少会去递增端口号,一般都是上线之前确定端口号,否则客户端不知道端口号,无法连接。
实例:
private static void bind(rverbootstrap rverbootstrap, final int port) { channelfuture future=rverbootstrap.bind(port); future.addlistener(new genericfuturelistener<future<? super void>>() { public void operationcomplete(future<? super void> future) { if (future.issuccess()) { system.out.println("端口[" + port + "]绑定成成都的大学有哪些功!"); } el { system.err.println("端口[" + port + "]绑定失败!"); //递归重新绑定端口号 bind(rverbootstrap, port + 1); } } });}
attr () 方法可以给服务端的 channel,也就是 niorversocketchannel 指定一些自定义属性,可以通过 channel.attr() 取出这个属性。
实例:
//省略了其它模板代码rverbootstrap.attr(attributekey.newinstance("rvername"), "nettyrver")
总结,一般来说 attr () 运用得比较少,了解即可。
childattr 可以给每一条连接指定自定义属性,可以通过 channel.attr() 取出该属性。
实例:
//省略了其它模板代码rverbootstrap.childattr(attributekey.newinstance("clientkey"), "clientvalue")
总结,常见的运用场景,客户端登录成功之后,给其对应的 channel 绑定标识,下次只需要判断该 channel 是否有标识即可知道其是否已经登录。
handler () 用于指定在服务端启动过程中的一些逻辑。
实例:
//省略了其它模板代码rverbootstrap.handler(new channelinitializer<niorversocketchannel>() { protected void initchannel(niorversocketchannel ch) { system.out.println("服务端启动中"); }});
总结,可以在服务端启动的过程中做一些初始化方面的工作,比如,读取数据库的配置数据放到缓存当中,这个作为了解即可。
childhandler () 用于指定处理新连接数据的读写处理逻辑。
实例:
//省略了其它模板代码rverbootstrap.childhandler(new channelinitializer<niosocketchannel>() { protected void initchannel(niosocketchannel ch) { //责任链,指定自定义处理业务的 handler ch.pipeline().addlast(new nettyrverhandler()); }});
总结,这个是核心,主要管理业务逻辑处理双向链表,后面会具体讲解
option () 给服务端 channel 设置一些属性,最常见的就是 so_backlog。
实例:
//省略了其它模板代码rverbootstrap.option(channeloption.so_backlog, 1024)
表示系统用于临时存放已完成三次握手的请求的队列的最大长度,如果连接建立频繁,服务器处理创建新连接较慢,可以适当调大这个参数。其实,客户端请求在服务端也是排队执行的,服务端的两大线程组分别监听客户端连接和处理客户端连接,一旦并发量很高的时候,服务端处理不过来,则会把等待处理的请求放入到临时队列里面,这个跟 java 线程池的思想是一样的。
childoption () 给每条连接设置一些 tcp 底层相关的属性。
手机屏幕失灵实例:
//省略了其它模板代码rverbootstrap .childoption(channeloption.so_keepalive, true) .childoption(channeloption.tcp_nodelay, true)
代码说明:
channeloption.so_keepalive 表示是否开启 tcp 底层心跳机制,true 未开启;channeloption.tcp_nodelay 表示是否开启 nagle 算法,true 表示关闭,fal 表示开启,通俗地说,如果要求高实时性,有数据发送时就马上发送,就关闭,如果需要减少发送次数减少网络交互,就开启。本节学习的核心知识点掌握,具体如下:
四个核心流程,分别是①设置线程组;②设置 io 模型;③指定连接读写处理逻辑;④绑定端口号;核心方法的使用场景,重点掌握①bind ();②childattr ();③childhandler ();④childoption () 的使用。本文发布于:2023-04-05 14:26:34,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/be02656cd1a8bd5427ffb3dd55c2be0a.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:bootstrap登录模板实例(html登录注册界面模板).doc
本文 PDF 下载地址:bootstrap登录模板实例(html登录注册界面模板).pdf
留言与评论(共有 0 条评论) |