package com.netty.core; import java.security.cert.CertificateException; import javax.net.ssl.SSLException; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LoggingHandler; import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.util.SelfSignedCertificate; import org.apache.log4j.Logger; import org.springframework.beans.factory.InitializingBean; import com.netty.util.NettyPropertiesUtil; public class NettyServer implements InitializingBean { Logger logger = Logger.getLogger(NettyServer.class); public boolean isSSL = true; public int port = 8443; public int threadSize = 1; public int connnecttimeout = 10000; public int sotimeout = 10000; public void init() { isSSL = Integer .parseInt(NettyPropertiesUtil.getProperty("netty.isSSL")) == 1 ? true : false; port = Integer.parseInt(NettyPropertiesUtil.getProperty("netty.port")); threadSize = Integer.parseInt(NettyPropertiesUtil .getProperty("netty.nioeventloopgroup.size")); connnecttimeout = Integer.parseInt(NettyPropertiesUtil .getProperty("netty.serverbootstrap.connnecttimeout")); sotimeout = Integer.parseInt(NettyPropertiesUtil .getProperty("netty.serverbootstrap.sotimeout")); } @SuppressWarnings({ "deprecation" }) public void start() throws CertificateException, SSLException, InterruptedException { logger.info("netty server start"); final SslContext sslCtx; if (isSSL) { SelfSignedCertificate ssc = new SelfSignedCertificate(); sslCtx = SslContext.newServerContext(ssc.certificate(), ssc.privateKey()); } else { sslCtx = null; } EventLoopGroup bossGroup = new NioEventLoopGroup(threadSize); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.option(ChannelOption.SO_BACKLOG, 1024); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .handler(new LoggingHandler(LogLevel.INFO)) .childHandler(new NettyServerInitializer(sslCtx)); b.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connnecttimeout); b.option(ChannelOption.SO_TIMEOUT, sotimeout); Channel ch = b.bind(port).sync().channel(); logger.info("netty server end"); ch.closeFuture().sync(); logger.info("netty end "); } finally { bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } } @Override public void afterPropertiesSet() throws Exception { try { logger.info(" netty conf init start"); init(); logger.info(" netty conf init end"); } catch (Exception e) { logger.info(" netty conf init fail"); e.printStackTrace(); } } }
package com.netty.core; import org.apache.log4j.Logger; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.FullHttpResponse; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpRequest; import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.handler.codec.http.HttpVersion; import io.netty.handler.codec.http.HttpHeaders.Names; public class NettyServerHandler extends ChannelInboundHandlerAdapter { Logger logger = Logger.getLogger(NettyServerHandler.class); @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof HttpRequest){ HttpRequest req = (HttpRequest) msg; logger.info("RECV MSG: "+req.getUri()); if(HttpHeaders.is100ContinueExpected(req)){ ctx.write(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.CONTINUE)); } String resp="ok"; FullHttpResponse response = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK, Unpooled.wrappedBuffer(resp.getBytes())); response.headers().set(Names.CONTENT_TYPE, "text/html; charset=utf-8"); response.headers().set(Names.CONTENT_LENGTH, response.content().readableBytes()); ctx.write(response).addListener(ChannelFutureListener.CLOSE); } } @Override public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { ctx.close(); } @Override public void channelReadComplete(ChannelHandlerContext ctx) { ctx.flush(); } }
package com.netty.core; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.http.HttpObjectAggregator; import io.netty.handler.codec.http.HttpServerCodec; import io.netty.handler.ssl.SslContext; public class NettyServerInitializer extends ChannelInitializer<SocketChannel> { private final SslContext sslCtx; public NettyServerInitializer() { sslCtx=null; } public NettyServerInitializer(SslContext sslCtx) { this.sslCtx = sslCtx; } @Override public void initChannel(SocketChannel ch) { ChannelPipeline p = ch.pipeline(); if (null!=sslCtx) { p.addLast(sslCtx.newHandler(ch.alloc())); } p.addLast(new HttpServerCodec()); //完整参数封装 p.addLast("aggregator", new HttpObjectAggregator(1048576)); p.addLast(new NettyServerHandler()); } }
package test.netty; import java.net.URI; import org.junit.Test; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.Unpooled; 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.NioSocketChannel; import io.netty.handler.codec.http.DefaultFullHttpRequest; import io.netty.handler.codec.http.HttpHeaders; import io.netty.handler.codec.http.HttpMethod; import io.netty.handler.codec.http.HttpRequestEncoder; import io.netty.handler.codec.http.HttpResponseDecoder; import io.netty.handler.codec.http.HttpVersion; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.handler.codec.http.HttpContent; import io.netty.handler.codec.http.HttpResponse; public class NettyClientTest { public void connect(String host, int port) throws Exception { EventLoopGroup workerGroup = new NioEventLoopGroup(); try { Bootstrap b = new Bootstrap(); b.group(workerGroup); b.channel(NioSocketChannel.class); b.option(ChannelOption.SO_KEEPALIVE, true); b.handler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { // 客户端接收到的是httpResponse响应,所以要使用HttpResponseDecoder进行解码 ch.pipeline().addLast(new HttpResponseDecoder()); // 客户端发送的是httprequest,所以要使用HttpRequestEncoder进行编码 ch.pipeline().addLast(new HttpRequestEncoder()); ch.pipeline().addLast(new HttpClientInboundHandler()); } }); // Start the client. ChannelFuture f = b.connect(host, port).sync(); URI uri = new URI("http://127.0.0.1:8443"); String msg = "Are you ok?"; DefaultFullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri.toASCIIString(), Unpooled.wrappedBuffer(msg.getBytes("UTF-8"))); // 构建http请求 request.headers().set(HttpHeaders.Names.HOST, host); request.headers().set(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.KEEP_ALIVE); request.headers().set(HttpHeaders.Names.CONTENT_LENGTH, request.content().readableBytes()); // 发送http请求 f.channel().write(request); f.channel().flush(); f.channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); } } @Test public void Test(){ try{ NettyClientTest client = new NettyClientTest(); client.connect("127.0.0.1", 8443); }catch(Exception e){ e.printStackTrace(); } } } class HttpClientInboundHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof HttpResponse) { HttpResponse response = (HttpResponse) msg; System.out.println("CONTENT_TYPE:" + response.headers().get(HttpHeaders.Names.CONTENT_TYPE)); } if(msg instanceof HttpContent) { HttpContent content = (HttpContent)msg; ByteBuf buf = content.content(); System.out.println(buf.toString(io.netty.util.CharsetUtil.UTF_8)); buf.release(); } } }
相关推荐
《Netty权威指南》第1版 是异步非阻塞通信领域的经典之作,基于最新版本Netty 5.0编写,是国内首本深入介绍Netty原理和架构的技术书籍,也是作者多年实战经验的总结和浓缩。在理论方面,讲解了Netty的逻辑架构模型和...
基于Netty+Redis+protobuf开发的即时通讯服务器 第一版是一个简版,只实现了很少的功能,现在已经迁移到 [v1.0](https://github.com/linyu19872008/cdeer-im/tree/v1.0) 第二版的目标有以下几点: 1 工程用...
NettyRPC开发指南 有兴趣的同学可以参考:。 NettyRPC 1.0 Build 2016/6/25 NettyRPC 1.0 中文简介: NettyRPC是基于Netty构建的RPC系统,消息网络传输支持目前主流的编码解码器 NettyRPC基于Java语言进行编写,网络...
Chat Room V1.0 是一个基于SpringBoot、Netty、HTML5、WebSocket和原生JavaScript构建的多人在线聊天系统。这个项目旨在实现高效、稳定且易于维护的实时通信功能,让多个用户能够实时交流,同时提供了在线人数统计、...
Netty基于Reactor模式,实现了高效的事件处理,通过I/O多路复用(如Java的Selector)来处理多个连接。这一设计使得Netty能够处理大量并发连接,提高了系统的吞吐量和响应速度。 书中详细讲解了Netty的Channel、...
Netty-socketio 是一个 Java 语言版本的 Socket.IO 服务器的实现,基于 Netty 框架开发。特性:Supports 0.7...0.9.16 (netty-socketio 1.6.6) and 1.0 (netty-socketio latest version) version of Socket.IO-...
在描述中的"akka-http-1.0-RC2.jar.zip"文件,我们关注的是Akka HTTP的1.0候选版本2(RC2)的JAR包,这是用于开发和运行基于Akka HTTP的应用程序的库。 Akka是一个开源的工具集,由Lightbend公司维护,旨在帮助...
传统BIO通信的弊端 在JDK 1.4推出JAVANIO1.0之前,基于JAVA 的所有Socket通信都采用 BIO 了同步阻塞模式( ),这种一请求一应答的通信模型简化了上层的应用开发, 但是在可靠性和性能方面存在巨大的弊端。...
简单,快速,轻量级的http restful服务器实现,基于Netty4和JDK1.8 + 产品特点 HTTP / 1.1和HTTP / 1.0协议支持 内置JSON / Protobuf序列化支持,JSON序列化框架使用Fastjson,依赖内置;如果使用protobuf序列化,...
Netty 的核心设计理念是基于 NIO(Non-blocking I/O)和异步事件驱动模型,这使得 Netty 在高并发场景下表现优秀,降低了系统资源的消耗。 二、HTTP 协议处理 在 Netty 中,HTTP 协议的处理主要依赖于 `...
描述中提到了"netty-ftp-receiver.zip",这是一个基于Netty实现的FTP接收器,实现了RFC 959“文件传输协议(FTP)”。Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于构建可扩展且高效的服务器和客户端...
它可能是基于Servlet或Netty等轻量级网络库实现,以保证高效运行。 4. **slw-restclient-1.0.jar**:客户端库,方便开发者在应用程序中调用远程RESTful服务。它提供了简单的API来发起HTTP请求,处理响应,简化了...
SIP(Session Initiation Protocol)通信器是一款基于开源的、跨平台的VoIP(Voice over Internet Protocol)和即时通讯软件,其1.0版本的源代码是理解SIP通信协议及其在实际应用中的实现的关键。本文将深入探讨这个...
它基于JBoss Netty,一个高性能的异步事件驱动的网络应用程序框架,确保了服务的高并发处理能力。RestExpress通过清晰的API设计,允许开发者以声明式的方式定义路由,极大地提高了开发效率。同时,它支持多种序列化...
这是一个基于netty的websocket项目,你可以直接使用他或者扩展他。 如果喜欢的话可以和我一起开发他。 加入我们或者其他问题都可以发送 给我的邮箱1003523958@qq.com 简单的介绍: ws://localhost:8848/1 代表连接id...
HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 HttpCore NIO 和 HttpClient 组件。HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP...
Apache Mina Server 深入教程V1.0是一份详尽的指南,旨在帮助开发者深入理解并有效地利用Apache Mina构建高性能、可扩展的网络应用程序。Apache Mina(Model-View-Controller for Network Applications)是一个Java...
SGIP1.2接口是基于SGIP1.0的升级版本,主要优化了数据传输的效率和安全性,增加了更多的控制命令和功能,比如支持长短信、彩信、WAP Push等服务。Java版实现意味着开发者可以利用Java的强大特性和丰富的库来处理这些...
### Java网络框架对比报告知识点详述 #### 一、引言 在Java网络开发领域,选择合适...Mina更适合需要快速开发的场景,而Netty则更适合对性能要求极高且需要高度定制的应用。根据项目的具体需求选择合适的框架是关键。
Leo-IM是基于Java语言、Netty框架、Vue+Element-UI开发的轻量级IM,服务端可独立运行(无需部署到web容器),HTTP服务和Socket服务可分开部署,使用基于Netty扩展的RESTful框架提供Web服务,简单易用,方便扩展。...