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();}}
  1. DiscardServerHandler继承了ChannelInboundHandlerAdapter,而不是直接实现父类ChannelInboundHandler,因为ChannelInboundHandlerAdapter已经够用了。
  2. 我们覆盖了channelRead()方法,这个方法在收到信息的时候调用。
  3. 这里使用的ByteBuf必须进行显示地进行关闭。
  4. 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();}
}
  1. 我们在这里使用了两个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初探,只写个服务端也能工作相关推荐

  1. Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码

    Netty实战 IM即时通讯系统(八)服务端和客户端通信协议编解码 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 客户端启动流程 实战: 客户端和服务端双向通信 数 ...

  2. Netty实战 IM即时通讯系统(四)服务端启动流程

    ## Netty实战 IM即时通讯系统(四)服务端启动流程 零. 目录 IM系统简介 Netty 简介 Netty 环境配置 服务端启动流程 实战: 客户端和服务端双向通信 数据传输载体ByteBuf ...

  3. Netty入门教程——认识Netty

    什么是Netty? Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一个易于使用的 API 的客户端/服务器框架. Netty 是一个广泛使用的 Java 网络编程框架(N ...

  4. Netty入门教程——初识Netty

    Netty入门教程之初识Netty,本次会写几篇文章来详细说下netty. 文章目录 什么是Netty 什么是Netty Netty 是一个利用 Java 的高级网络的能力,隐藏其背后的复杂性而提供一 ...

  5. Netty入门教程——深入浅出Netty

    在这里我们主要从TCP应用部分讲述 Netty 的架构体系. 它涉及到的内容主要分为三个部分 : bootstrap, channel, eventLoop. bootstrap 主要负责服务建立与发 ...

  6. java nio 客户端_Java网络编程:Netty框架学习(二)---Java NIO,实现简单的服务端客户端消息传输...

    概述 上篇中已经讲到Java中的NIO类库,Java中也称New IO,类库的目标就是要让Java支持非阻塞IO,基于这个原因,更多的人喜欢称Java NIO为非阻塞IO(Non-Block IO), ...

  7. 手写Redis服务端,从设计者的角度聊一聊Redis本身

    [文章来源]https://sourl.cn/mqFYeU 零,起因 我为什么要造redis这个轮子?1 破除对redis神秘感.2 "基础服务中台"的同事们在开会讨论redis云 ...

  8. PHP写webservice服务端

    1) WebService技术介绍 WebService是一种跨编程语言和跨操作系统平台的远程调用技术.仅仅有通过Web Service,client和server才可以自由的用HTTP进行通信.不论 ...

  9. Netty傻瓜教程(五):不能不谈Redis

    2019独角兽企业重金招聘Python工程师标准>>> MySql是关系型数据库,有强大的数据查询功能,支持事务,但是毕竟在硬盘中,访问量大额外开销也大:Redis将数据存储在内存中 ...

最新文章

  1. python难嘛-自学Python很难吗,为何会看不进去!
  2. 通俗理解checked Exception和unchecked Exception
  3. [Lintcode]41. Maximum Subarray/[Leetcode]53. Maximum Subarray
  4. Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)
  5. POJ2406-Power Strings【KMP】
  6. 移动Web应用程序开发HTML5篇
  7. DataTable新增列设置DefaultValue问题。
  8. ZJOI2007时态同步
  9. Oracle拜年段子,oracle标题
  10. 区块链 PBFT最多多少个节点
  11. 初级工程师该如何去学习,如何去研发开关电源?
  12. Python+FFmpeg提取哔哩哔哩安卓缓存
  13. c#生成二维码,一维码(条形码)
  14. Linux rm -rf 之rm: cannot remove `linux': Device or resource busy
  15. 喝豆浆对身体都有哪些好处?
  16. Microsoft Teams通话质量仪表盘(CQD)怎么玩?
  17. OpenCV Mat类详解和用法
  18. Datawhale零基础入门NLP赛事 - Task5 基于深度学习的文本分类2
  19. 全球气象数据下载总结-CRU数据,ERA数据NCEP-2数据
  20. 一种电子病历系统软件框架思想——B/S与C/S混合架构

热门文章

  1. using 的三种用法
  2. WPF中RadioButton绑定数据的正确方法
  3. 条款02:尽量以const,enum,inline代替#define
  4. PHP实现http与https转化[转张宴]
  5. Golang —— goroutine(协程)和channel(管道)
  6. Delphi 常用API 函数(好多都没见过)
  7. Python-TXT文本操作
  8. Uber将动态调价机制引入其外卖服务UberEats
  9. CentOS系统启动流程
  10. .NET Core竟然无法在Mac下进行build