如何构建一个基于netty的后端netty 服务器器

netty同时做HTTP和websocket服务器并且实现HTTP路由的思路 - 简书
下载简书移动应用
写了11085字,被3人关注,获得了5个喜欢
netty同时做HTTP和websocket服务器并且实现HTTP路由的思路
近期需要给别人做一个HTTP加Websocket的处理后端,果断选了spring+netty的组合,spring提供IOC容器+AOP+事务,netty处理IO,但是netty提供的HTTP比较底层,还需要自己处理路由,,,还是比Servlet麻烦不少,于是陆续将自己学习和编码过程中一些东西写出来,希望能帮的到别人。用的是netty5
学习netty用到的资源
《netty权威指南》,给很多步骤做出了解释,没解释的看API
官方的demo,下载netty-example-5.0.0.Alpha2-sources.jar源码包解压,给出了很多Demo
Github,netty项目很多,分析下源码
server端编码,主要讲一下channel中的handler
HttpServerCodec:ByteBuf-&HttpRequest或HttpContent和HttpResponse或者HttpContent-&ByteBuf,即HTTP请求的解码和编码
HttpObjectAggregator:把多个消息转换为一个单一的FullHttpRequest或是FullHttpResponse,原因是HTTP解码器会在每个HTTP消息中生成多个消息对象HttpRequest/HttpResponse,HttpContent,LastHttpContent
WebSocketServerCompressionHandler:WebSocket数据压缩(可选)
ChunkedWriteHandler:大文件支持(没有写在代码中,可选)
HttpHandler:自定义的HTTP和Websocket处理类,二者处理也可以分开在多个ChannelHandler中,在这里写在一个Handler中
handler方法和childHandler方法区别
handler存在于AbstractBootstrap,目的是添加一个handler,监听Bootstrap动作,它在初始化时就会执行
childHandler存在于ServerBootstrap,目的是添加一个handler,监听已经连接的客户端的Channel的动作和状态,在客户端连接成功后才执行。
option方法和childOption方法区别
option存在于AbstractBootstrap,提供给NioServerSocketChannel用来接收进入的连接。
childOption存在于ServerBootstrap ,提供给ServerChannel接收已经建立的连接。
public void run(final int port) throws InterruptedException {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer&SocketChannel&() {
protected void initChannel(SocketChannel ch)
throws Exception {
ch.pipeline().addLast("respDecoder-reqEncoder",
new HttpServerCodec())
.addLast("http-aggregator",
new HttpObjectAggregator(65536))
.addLast(new WebSocketServerCompressionHandler())
.addLast("action-handler", new HttpHandler());
ChannelFuture future = b.bind(new InetSocketAddress(port)).sync();
("The http server powered by netty is listening on " + port);
future.channel().closeFuture().sync();//阻塞处理,等待服务端链路关闭之后main函数才退出
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
自定义的ChannelHandler,用于处理HTTP和Websocket
区别HTTP和Websocket请求
public void messageReceived(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof FullHttpRequest) {//如果是HTTP请求,进行HTTP操作
handleHttpRequest(ctx, (FullHttpRequest) msg);
} else if (msg instanceof WebSocketFrame) {//如果是Websocket请求,则进行websocket操作
handleWebSocketFrame(ctx, (WebSocketFrame) msg);
上面的Object类型的msg就是extends SimpleChannelInboundHandler&Object&中的Object,我们可以定义ChannelHandler时将Object换成FullHttpRequest,这样就只处理HTTP请求,换成WebSocketFrame只处理websocket
HTTP请求的分发
//处理HTTP的代码
private void handleHttpRequest(ChannelHandlerContext ctx, FullHttpRequest req) {
HttpMethod method=req.method();
String uri=req.uri();
diapathcer(method,uri);
private void diapathcer(HttpMethod method,String uri){
if(method==HttpMethod.GET&&"/login".equals(uri)){
//....处理
}else if(method==HttpMethod.POST&&"/register".equals(uri)){
实际中路由不会这样写,我们可以自定义路由的实现,写在一个类中专门实现路由,或者自定义一个配置文件,像properties一样,每一行格式形如:(GET
\login LoginAction),我们知道properties是继承HashTable(String,String),我们可以自定义配置文件的对应类继承HashMap(String,HashMap(String,String)),我自己已经将路由和路由配置文件的实现完成,以后会陆续公开
自定义ChannelHandler代码
public class HttpHandler extends SimpleChannelInboundHandler&Object& {
public void messageReceived(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof FullHttpRequest) {//如果是HTTP请求,进行HTTP操作
handleHttpRequest(ctx, (FullHttpRequest) msg);
} else if (msg instanceof WebSocketFrame) {//如果是Websocket请求,则进行websocket操作
handleWebSocketFrame(ctx, (WebSocketFrame) msg);
public void channelReadComplete(ChannelHandlerContext ctx) {
ctx.flush();
//处理HTTP的代码
private void handleHttpRequest(ChannelHandlerContext ctx, FullHttpRequest req) {
HttpMethod method=req.method();
String uri=req.uri();
diapathcer(method,uri);
private void diapathcer(HttpMethod method,String uri){
if(method==HttpMethod.GET&&"/login".equals(uri)){
//....处理
}else if(method==HttpMethod.POST&&"/register".equals(uri)){
//处理Websocket的代码
private void handleWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) {
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:如何构建一个基于netty的后端服务器_百度知道君,已阅读到文档的结尾了呢~~
基于netty设计与实现的http服务器,netty http服务器,netty服务器搭建,netty 游戏服务器,netty服务器,netty4 游戏服务器,netty 文件服务器,netty web服务器,netty http,netty http server
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于netty设计与实现的http服务器
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&

我要回帖

更多关于 netty 关闭服务器 的文章

 

随机推荐