当前位置:首页 >> 教育
教育

交往Netty之 hello world

2025-08-19 12:19

new Thread(() -> { try { Socket socket = new Socket("127.0.0.1", 8000); while (true) { try { socket.getOutputStream().write((new Date() + ": hello world socket").getBytes()); // 睡眠5秒 Thread.sleep(5000); } catch (Exception e) { System.err.println(e); } } } catch (IOException e) { System.err.println(e); } }).start(); }}

先叫停server后端然后叫停client可以碰到server寄出恳请如下:

上面的 demo,从服务器文档中所我们可以碰到,在传统习俗的 IO 建模中所,每个相连创设最终便都需一个驱动程序来维护,每个驱动程序包涵一个 while true 死去循环,那么 10w 个相连并不相同 10w 个驱动程序,继而 10w 个 while 死去循环,这就带来如下几个关键问题:

驱动程序人力受限:驱动程序是作业系统中所颇为宝贵的人力,同一日子有大量的驱动程序正处于溢状态是颇为轻微的人力节约,作业系统耗不起驱动程序操作效率低下:同类型 CPU 核数固定,驱动程序爆炸事件便作业系统时有进行驱动程序操作,运用性能指标骤减。除了以上两个关键问题,IO 编程语言中所,我们碰到图表手写是以二进制引为单位。

为了妥善解决这三个关键问题,JDK 在 1.4 便提出了 NIO。

NIO(Non-blocking I/O,在Java教育领域,也称为New I/O),是一种同步非溢的I/O建模,也是I/O复用的根基,仍然被越来越多地运用到大型运用服务器,带入妥善解决高所发与大量相连、I/O处理关键问题的有效方式将。

NIO编程语言

java对于非漏出I/O的默许是在2002年引入的,位于JDK1.4的java.nio包中所.

IO和NIO的区隔:

IO是高后端二进制引和字符引的,而NIO是高后端缓冲区的。IO是溢模式的,NIO是非溢模式的NIO从另加了选择器的概念,可以通过选择器美国国家安全局多个通道。

NIO用的是事件功能。它可以用一个驱动程序把Accept,读,写操作,恳请处理的范式全干了。如果真的都没得继续做,它也不会死去循环,它会将驱动程序休眠一起,直到下一个事件来了再继续跟着,这样的一个驱动程序指NIO驱动程序。

package com.pine.springbootdemo01.netty;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.nio.charset.Charset;import java.util.iterator;import java.util.Set;/** * @author anziyang * @version V1.0 * @date 2022/3/1 2:29 当日 **/public class NIOServer { public static void main(String[] args) throws IOException { Selector serverSelector = Selector.open(); Selector clientSelector = Selector.open(); // 叫停一个驱动程序附加select 用作美国国家安全局是否有从最初相连 new Thread(() -> { try { // 并不相同IO编程语言中所服务器叫停 ServerSocketChannel listenerChannel = ServerSocketChannel.open(); listenerChannel.socket().bind(new InetSocketAddress(8000)); listenerChannel.configureBlocking(false); listenerChannel.register(serverSelector, SelectionKey.OP_ACCEPT); while (true) { // 监测是否有从最初相连,这里的1指的是溢的时间为 1ms if (serverSelector.select(1)> 0) { Set set = serverSelector.selectedKeys(); Iterator keyIterator = set.iterator(); while (keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); if (key.isAcceptable()) { try { // (1) 每来一个从新相连,不需创设一个驱动程序,而是这样一来特许到 clientSelector SocketChannel clientChannel = ((ServerSocketChannel) key.channel()).accept(); clientChannel.configureBlocking(false); clientChannel.register(clientSelector, SelectionKey.OP_READ); } finally { keyIterator.remove(); } } } } } } catch (IOException e) { System.err.println(e); } }).start(); // 叫停一个驱动程序附加select 用作美国国家安全局哪些相连有图表可读 new Thread(() -> { try { while (true) { // (2) 的产品轮询是否有哪些相连有图表可读,这里的1指的是溢的时间为 1ms if (clientSelector.select(1)> 0) { Set set = clientSelector.selectedKeys(); Iterator keyIterator = set.iterator(); while (keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); if (key.isReadable()) { try { SocketChannel clientChannel = (SocketChannel) key.channel(); ByteBuffer byteBuffer = ByteBuffer.allocate(1024); // (3) 高后端 Buffer clientChannel.read(byteBuffer); byteBuffer.flip(); System.out.println(Charset.defaultCharset().newdecoder().decode(byteBuffer) .toString()); } finally { keyIterator.remove(); key.interestOps(SelectionKey.OP_READ); } } } } } } catch (IOException e) { System.err.println(e); } }).start(); }}

从上面的文档中所我们可以碰到

NIO 建模中所通常会有两个驱动程序,每个驱动程序附加一个轮询器 selector ,在我们这个举例中所serverSelector交由轮询是否有从最初相连,clientSelector交由轮询相连是否有图表可读服务器监测到从最初相连便,早已创设一个从最初驱动程序,而是这样一来将从新相连附加到clientSelector上,这样就不用 IO 建模中所 1w 个 while 循环在死去等,详见(1)clientSelector被一个 while 死去循环包裹着,如果在某一日子有多条相连有图表可读,那么通过 clientSelector.select(1)步骤可以轮询出来,进而的产品处理,详见(2)图表的手写高后端 Buffer,详见(3)

叫停NIOServer main步骤然后叫停以前的client可以碰到控制打印

Netty编程语言

首先看下netty如何借助服务器的:

package com.pine.springbootdemo01.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.ChannelInitializer;import io.netty.channel.SimpleChannelInboundHandler;import io.netty.channel.nio.NioEventLoopGroup;import io.netty.channel.socket.nio.NioServerSocketChannel;import io.netty.channel.socket.nio.NioSocketChannel;import io.netty.handler.codec.string.StringDecoder;/** * @author anziyang * @version V1.0 * @date 2022/3/1 2:41 当日 **/public class NettyServer { public static void main(String[] args) { ServerBootstrap serverBootstrap = new ServerBootstrap(); NioEventLoopGroup boss = new NioEventLoopGroup(); NioEventLoopGroup worker = new NioEventLoopGroup(); serverBootstrap.group(boss, worker).channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer() { protected void initChannel(NioSocketChannel ch) { ch.pipeline().addLast(new StringDecoder()); ch.pipeline().addLast(new SimpleChannelInboundHandler() { @Override protected void channelRead0(ChannelHandlerContext ctx, String msg) { System.out.println(msg); } }); } }).bind(8000); }}

上面文档引人注意比前面的NIO少很多文档,与众不同了不少.

可以碰到netty服务器可用内容:

本文就先聊这么多,主要是与众不同下netty编程语言,看下经典的hello world.

感觉有进帐点个特为,转发下哦

参见文档:

上海看白癜风哪里好
四川白癜风医院预约挂号
沈阳肛肠医院地址
漳州白癜风检查费用
北京看妇科哪个医院比较好

上一篇: 医生劝告:宝宝没到2岁前,3种辅食最好不及吃,容易拖垮脾胃

下一篇: 对标名车X5L! 蔚来ES7将4月发布:大五座、带激光雷达

相关阅读
友情链接