场景

什么是Netty

Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架。

Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。

Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Netty 都是异步的。

Netty 是最流行的 NIO 框架,它已经得到成百上千的商业、商用项目验证,许多框架和开源组件的底层 rpc 都是使用的 Netty,如 Dubbo、Elasticsearch 等等。

这里使用IDEA和Gradle,也可以使用Maven作为依赖管理工具。

在Windows中下载配置以及在IDEA中配置Gradle参照如下

https://mp.csdn.net/console/editor/html/108578033

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

IDEA新建一个Gradle项目

配置使用Java并设置JDK

新建之后的项目目录

此时会自动在build.gradle类似于Maven的pom.xml中引入了junit的依赖。

这里需要引入Netty的依赖。

浏览器打开Maven中央仓库地址

https://mvnrepository.com/

搜索netty-all

选择稳定版本这里是4.1.52

选择Gradle的依赖

将其复制进IDEA下的build.gradle中

dependencies {// https://mvnrepository.com/artifact/io.netty/netty-allcompile group: 'io.netty', name: 'netty-all', version: '4.1.52.Final'
}

因为上面已经设置了自动导入依赖。

所以保存后就能实现自动导入。

同样在上面的gradle的配置的博客中设置了jar包的存储位置。

来到配置的jar包的存储位置就可以看到jar包所在的位置。

在项目中引入Netty后,在src下新建包,包下新建HelloWorldServer类作为服务端的启动类

在启动类中新建main方法

package com.badao.netty;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;public class HelloWorldServer {public static void main(String[] args) throws  Exception{EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try{//服务端启动类-Netty提供的启动服务端的类ServerBootstrap serverBootstrap = new ServerBootstrap();//参数为两个事件组 前面的用来接收请求 后面的用来处理//childHandler 设置请求到了之后进行处理的处理器serverBootstrap.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class).childHandler(new HelloWorldServerInitializer());//绑定端口ChannelFuture channelFuture = serverBootstrap.bind(70).sync();channelFuture.channel().closeFuture().sync();}finally {//关闭事件组bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}

注意这里的都是引入的netty的包,不要引入nio的包。

首先EventLoopGroup是事件循环组,可以认为是一个死循环,一直监听是否有连接然后处理。

这里使用两个是Netty官方推荐,一个bossGroup只用来监听连接,然后交由后面的workerGroup进行处理。

ServerBootstrap是Netty的启动服务端的类。

分别设置两个group并设置通道为NioServerSocketChannel

然后childHandler是设置对请求具体处理的处理器。这里新建了一个HelloWorldInititalizer类作为服务端初始化的类。

下面绑定了70端口。

所以在包下再新建类HelloWorldServerInitializer作为服务端初始化器,并使其继承ChannelInitializer

然后重写initChannel方法,连接一旦被创建后就会执行此方法。

package com.badao.netty;import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpServerCodec;//服务端初始化器
public class HelloWorldServerInitializer extends ChannelInitializer<SocketChannel> {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {//连接一旦被创建后就会执行此方法ChannelPipeline channelPipeline = ch.pipeline();//在最后添加由Netty提供的处理器channelPipeline.addLast("httpServerCodec",new HttpServerCodec());channelPipeline.addLast("helloWorldServerHandler",new HelloWorldServerHandler());}
}

注意这里的继承的泛型里面的SocketChannel是在netty包下的。

在方法中在处理的最后添加处理器,第一个添加的是Netty自带的处理器。

后面再创建一个自定的处理器HelloWorldServerHandler

前面的name可以自己定义。

所以需要在包下再新建HelloWorldServerHandler处理器类并使其继承SimpleChannelInboundHandler

然后重写其方法channelRead0

此方法就是读取客户端发送过来的请求并返回响应。

package com.badao.netty;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.*;
import io.netty.util.CharsetUtil;//自定义的处理器
public class HelloWorldServerHandler extends SimpleChannelInboundHandler<HttpObject> {//此方法就是读取客户端发送过来的请求并返回响应@Overrideprotected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {if(msg instanceof HttpRequest){//构造返回内容ByteBuf content = Unpooled.copiedBuffer("公众号:霸道的程序猿", CharsetUtil.UTF_8);//构造响应FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK,content);//设置响应头类型response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/plain");//设置响应头长度response.headers().set(HttpHeaderNames.CONTENT_LENGTH,content.readableBytes());//返回响应ctx.writeAndFlush(response);}}
}

在方法中构造返回的内容和响应头,然后将其返回响应。

这样一个客户端,功能是接受到请求时返回字符串"公众号:霸道的程序猿",就搭建完成了。

找到项目下的.idea下的gradle.xml,将下面的

<option name="delegatedBuild" value="false" />

改为false,如果没有则将这行加上

这样就能使用java运行main方法,gradle就不会认为其是task了。

运行最上面的服务端的main方法。

如果没有输出任何报错则是运行成功。

怎样去验证服务端搭建成功?

这里可以使用curl去进行请求验证

cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。
它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。
cURL还包含了用于程序开发的libcurl。

cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。

curl还支持SSL认证、HTTP POST、HTTP PUT、FTP上传, HTTP form based upload、proxies、HTTP/2、cookies、用户名+密码认证(Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos)、file transfer resume、proxy tunneling。

这里因为是在Windows下,所以需要下载curl

下载地址:

https://curl.haxx.se/windows/

这里下载64位的,将其解压到磁盘上的某目录。

找到其目录下的bin目录,即curl.exe所在的目录。

在此处打开cmd

curl http://localhost:70

Netty在IDEA中搭建HelloWorld服务端并对Netty执行流程与重要组件进行介绍相关推荐

  1. .net5 WebAPI中搭建WebSocket服务端

    背景:需要开发一个WebSocket服务端,用来向h5客户端推送消息:以前的做法是直接做一个windows服务,专门开一个端口来进行WebSocket连接,现在可以在.net5 WebAPI中直接支持 ...

  2. Netty源码分析系列之服务端Channel的端口绑定

    扫描下方二维码或者微信搜索公众号菜鸟飞呀飞,即可关注微信公众号,Spring源码分析和Java并发编程文章. 微信公众号 问题 本文内容是接着前两篇文章写的,有兴趣的朋友可以先去阅读下两篇文章: Ne ...

  3. Netty搭建Http2服务端并支持TLS传输加密

    Netty搭建Http2服务端并支持TLS传输加密 @Slf4j public class SslUtil {public static SslContext sslContext() {SslPro ...

  4. 【初识Netty使用Netty实现简单的客户端与服务端的通信操作Netty框架中一些重要的类以及方法的解析】

    一.Netty是什么? Netty 由 Trustin Lee(韩国,Line 公司)2004 年开发 本质:网络应用程序框架 实现:异步.事件驱动 特性:高性能.可维护.快速开发 用途:开发服务器和 ...

  5. 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)

    本文由"yuanrw"分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读 ...

  6. 如何在 MacOS 环境下搭建 SVN 服务端环境

    文章目录 在服务端创建资源仓库 资源仓库访问权限配置 给资源仓库添加用户 配置用户组及用户的权限 启动 SVN 服务器 停止 SVN 服务器 SVN 是一个使用十分广泛的开放源代码的版本控制系统.在 ...

  7. vue.js+koa2项目实战(四)搭建koa2服务端

    搭建koa2服务端 安装两个版本的koa 一.版本安装 1.安装 koa1 npm install koa -g 注:必须安装到全局 2.安装 koa2 npm install koa@2 -g 二. ...

  8. HTML+JS+websocket 实现联机“游戏王”对战(十)- 搭建游戏服务端

    目录: 游戏王联机卡牌对战 1 - 前言 游戏王联机卡牌对战 2 - 联机模式 游戏王联机卡牌对战 3 - 界面布局 游戏王联机卡牌对战 4 - 卡组系统 游戏王联机卡牌对战 5 - 卡片选中系统 游 ...

  9. 快速搭建Kerberos服务端及入门使用

    快速搭建Kerberos服务端及入门使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Kerberos是一种网络身份验证协议.它旨在通过使用秘密密钥加密为客户端/服务器应用程序提 ...

最新文章

  1. 记录AJAX在VS2005中的使用第二编
  2. import java.io 包下载_Go 包管理机制深入分析
  3. 电脑内存占用莫名很高_CPU占用高,电脑莫名卡顿?万能的重启拯救不了就用这3招,妥了!...
  4. 中小企业的软件需求问题
  5. 安装 Power BI 报表服务器
  6. 如何将原图和json融合_用 base64 进行图片和字符串互转,并保存至 json
  7. 4个数之和 4Sum II
  8. RHadoop安装和使用
  9. 基于javaweb+springboot的电影售票系统(java+Springboot+ssm+mysql+jsp+maven)
  10. ucgui 字体生成与字体个性化编辑
  11. 5G NR CSI Report中关于codebook/PMI的理解(1)
  12. 操作系统原理课程 期末考试复习重点
  13. 入门:安装Python
  14. w ndows10卸载word,windows10系统下怎样卸载office 2003
  15. 在商业化这件事上,百度Apollo智能车联究竟做得怎么样了?
  16. 小米和联想的“骁龙”之争,首发第一,友谊第二
  17. 动态规划-击爆气球 Burst Balloons
  18. oracle异地双活距离,再谈异地双活容灾部署(6.24)
  19. 安全防御 IPsec VPN
  20. 《Hadoop系列》脚本开发自动化配置伪分布式Hadoop

热门文章

  1. 搭建第一个SpringBoot工程;SpringBoot整合mybatis;SpringBoot整合Redis-cluster集群;SpringBoot整合EhCache;
  2. Non-interger Area 分类讨论 奇偶 取模 牛客练习赛95
  3. java增强型for报错_Java基础——增强for循环
  4. Nginx教程系列四:实现反向代理配置
  5. linux常用命令笔记(持续更新)
  6. 学生用的笔记本电脑什么样的好_大学生用的学生党笔记本什么牌子好,听听学姐的...
  7. 3-Qt6命令行输出显示
  8. 维基百科用php,在PHP中解析维基百科标记的最佳方法是什么?
  9. Linux引到过程与服务控制
  10. android富文本图片自适应,Android 图片混排富文本编辑器控件