Netty傻瓜教程(一):Netty初探,只写个服务端也能工作
2019独角兽企业重金招聘Python工程师标准>>>
霸王硬上,直接开始,服务端:
package com.hengzenc.NettyServer;import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;public class DiscardServerHandler extends ChannelInboundHandlerAdapter {@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg){ctx.write(msg);ctx.flush();}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause){cause.printStackTrace();ctx.close();}}
- DiscardServerHandler继承了ChannelInboundHandlerAdapter,而不是直接实现父类ChannelInboundHandler,因为ChannelInboundHandlerAdapter已经够用了。
- 我们覆盖了channelRead()方法,这个方法在收到信息的时候调用。
- 这里使用的ByteBuf必须进行显示地进行关闭。
- exceptionCaught关闭链接的时候,通常应当首先给客户端发送一个错误消息。
现在我们用main()方法来启动DiscardServerHandler的服务器
package com.hengzenc.NettyServer;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;public class DiscardServer {private int port;public DiscardServer(int port) {this.port = port;}public void run() throws Exception {EventLoopGroup bossGroup = new NioEventLoopGroup(); // (1)EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap(); // (2)b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) // (3).childHandler(new ChannelInitializer<SocketChannel>() { // (4)@Overridepublic void initChannel(SocketChannel ch) throws Exception {ch.pipeline().addLast(new DiscardServerHandler());}}).option(ChannelOption.SO_BACKLOG, 128) // (5).childOption(ChannelOption.SO_KEEPALIVE, true); // (6)// Bind and start to accept incoming connections.ChannelFuture f = b.bind(port).sync(); // (7)// Wait until the server socket is closed.// In this example, this does not happen, but you can do that to gracefully// shut down your server.f.channel().closeFuture().sync();} finally {workerGroup.shutdownGracefully();bossGroup.shutdownGracefully();}}public static void main(String[] args) throws Exception {int port;if (args.length > 0) {port = Integer.parseInt(args[0]);} else {port = 8080;}new DiscardServer(port).run();}
}
- 我们在这里使用了两个NioEventLoopGroup来处理I/O操作,第一个叫做boss,接收链接请求;第二个叫做worker,在boss接受了请求之后向worker注册。具体使用多少线程取决于EventLoopGroup的实现。
2. ServerBootstrap是建立服务器的帮助类。你可以直接使用Channel来建立服务器。不过请注意这是个无聊的过程,在大多数情况下不要这样用。
3. 我们在这里使用NioServerSocketChannel来初始新的Channel来接收请求。
4. 这里指定的handler经常被新Channel评估。ChannelInitializer是帮助用户配置新Channel的特定handler。
5. 我们在这里是实现一个TCP/IP服务器,我们使用了tcpNoDelay和keepAlive,至于其它的选项,请到ChannelOption和ChannelConfig里面去查找。
6. option是给接受请求的NioServerSocketChannel的,childOption是给父ServerChannel接受的Channel,在这里是NioServerSocketChannel。
7. 绑定端口,启动服务器。
上一篇写好了一个服务器,可以在本地使用telnet localhost 8080来测试这个服务器,这个服务器只是简单地回复你发给它的信息,如下图所示:
转载于:https://my.oschina.net/u/438393/blog/843563
Netty傻瓜教程(一):Netty初探,只写个服务端也能工作相关推荐
- Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码
Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 客户端启动流程 实战: 客户端和服务端双向通信 数 ...
- Netty实战 IM即时通讯系统(四)服务端启动流程
## Netty实战 IM即时通讯系统(四)服务端启动流程 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 实战: 客户端和服务端双向通信 数据传输载体ByteBuf ...
- Netty入门教程——认识Netty
什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架. Netty 是一个广泛使用的 Java 网络编程框架(N ...
- Netty入门教程——初识Netty
Netty入门教程之初识Netty,本次会写几篇文章来详细说下netty. 文章目录 什么是Netty 什么是Netty Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一 ...
- Netty入门教程——深入浅出Netty
在这里我们主要从TCP应用部分讲述 Netty 的架构体系. 它涉及到的内容主要分为三个部分 : bootstrap, channel, eventLoop. bootstrap 主要负责服务建立与发 ...
- java nio 客户端_Java网络编程:Netty框架学习(二)---Java NIO,实现简单的服务端客户端消息传输...
概述 上篇中已经讲到Java中的NIO类库,Java中也称New IO,类库的目标就是要让Java支持非阻塞IO,基于这个原因,更多的人喜欢称Java NIO为非阻塞IO(Non-Block IO), ...
- 手写Redis服务端,从设计者的角度聊一聊Redis本身
[文章来源]https://sourl.cn/mqFYeU 零,起因 我为什么要造redis这个轮子?1 破除对redis神秘感.2 "基础服务中台"的同事们在开会讨论redis云 ...
- PHP写webservice服务端
1) WebService技术介绍 WebService是一种跨编程语言和跨操作系统平台的远程调用技术.仅仅有通过Web Service,client和server才可以自由的用HTTP进行通信.不论 ...
- Netty傻瓜教程(五):不能不谈Redis
2019独角兽企业重金招聘Python工程师标准>>> MySql是关系型数据库,有强大的数据查询功能,支持事务,但是毕竟在硬盘中,访问量大额外开销也大:Redis将数据存储在内存中 ...
最新文章
- python难嘛-自学Python很难吗,为何会看不进去!
- 通俗理解checked Exception和unchecked Exception
- [Lintcode]41. Maximum Subarray/[Leetcode]53. Maximum Subarray
- Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)
- POJ2406-Power Strings【KMP】
- 移动Web应用程序开发HTML5篇
- DataTable新增列设置DefaultValue问题。
- ZJOI2007时态同步
- Oracle拜年段子,oracle标题
- 区块链 PBFT最多多少个节点
- 初级工程师该如何去学习,如何去研发开关电源?
- Python+FFmpeg提取哔哩哔哩安卓缓存
- c#生成二维码,一维码(条形码)
- Linux rm -rf 之rm: cannot remove `linux': Device or resource busy
- 喝豆浆对身体都有哪些好处?
- Microsoft Teams通话质量仪表盘(CQD)怎么玩?
- OpenCV Mat类详解和用法
- Datawhale零基础入门NLP赛事 - Task5 基于深度学习的文本分类2
- 全球气象数据下载总结-CRU数据,ERA数据NCEP-2数据
- 一种电子病历系统软件框架思想——B/S与C/S混合架构