Netty的服务端的建立

用Netty建立服务端, 首先我们应该新建立一个新的类, 作为服务端, 在其中写一个run方法, 作为启动:

 1 public void run(){
 2         //  处理 Nio的Accept
 3         EventLoopGroup boss = new NioEventLoopGroup();
 4         //  处理 Nio的Read和Write事件
 5         EventLoopGroup worker = new NioEventLoopGroup();
 6         try {
 7             //  Netty中服务端启动类
 8             ServerBootstrap bootstrap = new ServerBootstrap();
 9             //  启动类配置启动类中加入两个线程组
10             bootstrap.group(boss, worker);
11             //  启动类配置Channel配置,Channel为异步TCP Socket连接
12             bootstrap.channel(NioServerSocketChannel.class);
13             //  启动类配置SO_BACKLOG 含义允许连接客户端数量为2000
14             bootstrap.option(ChannelOption.SO_BACKLOG, Socketbacklog);
15             //  启动类配置SO_REUSEADDR 含义地址复用, 允许重复使用本地地址和端口
16             bootstrap.option(ChannelOption.SO_REUSEADDR, true);
17             bootstrap.childHandlernew ChannelInitializer<SocketChannel>() {
18                 @Override
19                 public void initChannel(SocketChannel ch) throws Exception {
20                     ch.pipeline().addLast(new ServerHandler()); //添加服务端的业务处理类
21                 }
22             });
23             //  保存Channel异步操作的结果
24             ChannelFuture channelFuture = bootstrap.bind(PORT).sync(); // 绑定端口, 并启动
25
26             channelFuture.channel().closeFuture().sync(); // 关闭连接
27         } catch (Exception e) {
28              e.printStackTrace();
29         } finally { //优雅的关闭服务器
30             boss.shutdownGracefully();
31             worker.shutdownGracefully();
32         }
33     }
34 }

1. NioEventLoopGroup 是用来处理I/O操作的多线程事件循环器,Netty 提供了许多不同的 EventLoopGroup 的实现用来处理不同的传输。在这个例子中我们实现了一个服务端的应用,因此会有2个 NioEventLoopGroup 会被使用。第一个经常被叫做‘boss’,用来接收进来的连接。第二个经常被叫做‘worker’,用来处理已经被接收的连接,一旦‘boss’接收到连接,就会把连接信息注册到‘worker’上。如何知道多少个线程已经被使用,如何映射到已经创建的 Channel 上都需要依赖于 EventLoopGroup 的实现,并且可以通过构造函数来配置他们的关系。

2. ServerBootStrap是一个启动 NIO 服务的辅助启动类。你可以在这个服务中直接使用 Channel,但是这会是一个复杂的处理过程,在很多情况下你并不需要这样做。

在这个方法中, 第20行的位置我们添加了业务的处理类ServerHandler, 这个类是我们接下来需要写的, 它继承自ChannelInboundHandlerAdapter类, 通过重写其中的一些方法, 我们就可以进行我们想要的操作了:

1 public void channelActive(ChannelHandlerContext ctx) // 在channel被启用的时候触发 (在建立连接的时候)
2 public void channelRead(ChannelHandlerContext ctx, Object msg) // 在数据被接收的时候调用
3 public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) // 出现报错时调用

msg是服务端接收到的数据, 而我们可以通过ctx.channel()方法来获取传来该值的channel

这里只列出了部分ChannelInboundHandlerAdapter中的方法, 其他的大家可以去查一下(其实这些方法命名十分简单明了了), 如果我们想讲客户端传来的数值都直接输出, 我们可以这样:

1     @Override
2     public void channelRead(ChannelHandlerContext ctx, Object msg) {
3         ctx.write(msg);
4         ctx.flush();
5     }

如果我们想传值到服务端去, 我们可以先定义一个Channel = ctx.channel(), 早通过channel的writeAndFlush()方法将信息作为参数传到相应的客户端去

好了, 就写到这儿吧, 毕竟我也只是个初学者, 以后再补充吧!

如有错误, 欢迎指出

原文地址:https://www.cnblogs.com/qq1914808114/p/10768851.html

时间: 2024-10-05 21:37:25

Netty的服务端的建立的相关文章

Netty实现服务端客户端长连接通讯及心跳检测

通过netty实现服务端与客户端的长连接通讯,及心跳检测.        基本思路:netty服务端通过一个Map保存所有连接上来的客户端SocketChannel,客户端的Id作为Map的key.每次服务器端如果要向某个客户端发送消息,只需根据ClientId取出对应的SocketChannel,往里面写入message即可.心跳检测通过IdleEvent 事件,定时向服务端放送Ping消息,检测SocketChannel是否终断.         环境JDK1.8 和netty5      

在SVN客户端操作在SVN的服务端重新建立一个项目,并且把原来的项目导入到这个新建的项目中

在开发的过程中,我们的一期项目开发完了,二期项目要开始了,但是我们的项目二期和一期差别很大,老大又让在SVN上保存一份原来的项目.以前没做过头大呀,上网找了半天没照出来.最后自己各种 各种尝试,终于在SVN服务端又建立了一个文件夹,并且把我们之前的项目导入了.在此记录下来,希望能帮到需要的童鞋. 首先在任意位置右键选中checkout,如图: 然后点击URL of repository后的按钮,调到如下界面: 然后在根部路下创建一个文件夹(Create folder),如下图: 然后就可以在仓库

原理剖析-Netty之服务端启动工作原理分析(下)

一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分析Netty的源码版本为:netty-netty-4.1.22.Final: 二.三.四章节请看上一章节 四.源码分析Netty服务端启动 上一章节,我们主要分析了一下线程管理组对象是如何被实例化的,并且还了解到了每个线程管理组都有一个子线程数组来处理任务: 那么接下来我们就直接从4.6开始分析了:

通过netty实现服务端与客户端的长连接通讯,及心跳检测。

基本思路:netty服务端通过一个Map保存所有连接上来的客户端SocketChannel,客户端的Id作为Map的key.每次服务器端如果要向某个客户端发送消息,只需根据ClientId取出对应的SocketChannel,往里面写入message即可.心跳检测通过IdleEvent 事件,定时向服务端放送Ping消息,检测SocketChannel是否终断. 环境JDK1.8 和netty5 以下是具体的代码实现和介绍: 1公共的Share部分(主要包含消息协议类型的定义) 设计消息类型:

Netty HTTP 服务端入门开发

一. HTTP 简介 HTTP(超文本传输协议) 协议是建立在 TCP 传输协议之上的应用层协议,它的发展是万维网协会和 Internet 工作小组和 IETF 合作的结果. HTTP 是一个属于应用层的面向对象的协议,由于其便捷,快速的方式,适用于分布式超媒体信息系统. HTTP 协议的主要特点如下: 支持 Client/Server 模式. 简单---- 客户端向服务器请求服务时,只需指定服务的 URL, 携带必要的请求参数或者消息体; 灵活---- HTTP 允许传输任意类型的数据对象,传

netty服务端启动--ServerBootstrap源码解析

netty服务端启动--ServerBootstrap源码解析 前面的第一篇文章中,我以spark中的netty客户端的创建为切入点,分析了netty的客户端引导类Bootstrap的参数设置以及启动过程.显然,我们还有另一个重要的部分--服务端的初始化和启动过程没有探究,所以这一节,我们就来从源码层面详细分析一下netty的服务端引导类ServerBootstrap的启动过程. spark中netty服务端的创建 我们仍然以spark中对netty的使用为例,以此为源码分析的切入点,首先我们看

netty 5 alph1源码分析(服务端创建过程)

参照<Netty系列之Netty 服务端创建>,研究了netty的服务端创建过程.至于netty的优势,可以参照网络其他文章.<Netty系列之Netty 服务端创建>是 李林锋撰写的netty源码分析的一篇好文,绝对是技术干货.但抛开技术来说,也存在一些瑕疵. 缺点如下 代码衔接不连贯,上下不连贯. 代码片段是截图,对阅读代理不便(可能和阅读习惯有关) 本篇主要内容,参照<Netty系列之Netty 服务端创建>,梳理出自己喜欢的阅读风格. 1.整体逻辑图 整体将服务

Netty服务端的业务流程分析

Netty的服务端怎么和java NIO联系起来的,一直很好奇这块内容,这里跟下代码,下篇文章看下Channel相关的知识. final ChannelFuture initAndRegister() { final Channel channel = channelFactory().newChannel(); // try { init(channel); } catch (Throwable t) { channel.unsafe().closeForcibly(); //立即关闭通道且不

netty源码分析之服务端启动

ServerBootstrap与Bootstrap分别是netty中服务端与客户端的引导类,主要负责服务端与客户端初始化.配置及启动引导等工作,接下来我们就通过netty源码中的示例对ServerBootstrap与Bootstrap的源码进行一个简单的分析.首先我们知道这两个类都继承自AbstractBootstrap类 接下来我们就通过netty源码中ServerBootstrap的实例入手对其进行一个简单的分析. // Configure the server. EventLoopGrou