`
knight_black_bob
  • 浏览: 853385 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

netty 基于 http1.0 开发

阅读更多

 

 

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权威指南》第1版 是异步非阻塞通信领域的经典之作,基于最新版本Netty 5.0编写,是国内首本深入介绍Netty原理和架构的技术书籍,也是作者多年实战经验的总结和浓缩。在理论方面,讲解了Netty的逻辑架构模型和...

    基于Netty+Redis+protobuf开发的即时通讯服务器

    基于Netty+Redis+protobuf开发的即时通讯服务器 第一版是一个简版,只实现了很少的功能,现在已经迁移到 [v1.0](https://github.com/linyu19872008/cdeer-im/tree/v1.0) 第二版的目标有以下几点: 1 工程用...

    java版分销系统源码-NettyRPC:NettyRPC是基于Netty的高性能javarpc服务器,使用kryo,hessian,prot

    NettyRPC开发指南 有兴趣的同学可以参考:。 NettyRPC 1.0 Build 2016/6/25 NettyRPC 1.0 中文简介: NettyRPC是基于Netty构建的RPC系统,消息网络传输支持目前主流的编码解码器 NettyRPC基于Java语言进行编写,网络...

    聊天室 Chat Room V1.0 (SpringBoot + Netty + H5 + WebSocket + 原生JS)

    Chat Room V1.0 是一个基于SpringBoot、Netty、HTML5、WebSocket和原生JavaScript构建的多人在线聊天系统。这个项目旨在实现高效、稳定且易于维护的实时通信功能,让多个用户能够实时交流,同时提供了在线人数统计、...

    Netty 4.x 用户指南 - v1.0.rar

    Netty基于Reactor模式,实现了高效的事件处理,通过I/O多路复用(如Java的Selector)来处理多个连接。这一设计使得Netty能够处理大量并发连接,提高了系统的吞吐量和响应速度。 书中详细讲解了Netty的Channel、...

    Socket.IO​服务器Netty-socketio.zip

    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-RC2.jar.zip"文件,我们关注的是Akka HTTP的1.0候选版本2(RC2)的JAR包,这是用于开发和运行基于Akka HTTP的应用程序的库。 Akka是一个开源的工具集,由Lightbend公司维护,旨在帮助...

    高清Netty5.0架构剖析和源码解读

    传统BIO通信的弊端 在JDK 1.4推出JAVANIO1.0之前,基于JAVA 的所有Socket通信都采用 BIO 了同步阻塞模式( ),这种一请求一应答的通信模型简化了上层的应用开发, 但是在可靠性和性能方面存在巨大的弊端。...

    dorado:基于Netty4开发的简单,轻量级,高性能的HTTP Restful API服务器

    简单,快速,轻量级的http restful服务器实现,基于Netty4和JDK1.8 + 产品特点 HTTP / 1.1和HTTP / 1.0协议支持 内置JSON / Protobuf序列化支持,JSON序列化框架使用Fastjson,依赖内置;如果使用protobuf序列化,...

    netty_container:来自http的

    Netty 的核心设计理念是基于 NIO(Non-blocking I/O)和异步事件驱动模型,这使得 Netty 在高并发场景下表现优秀,降低了系统资源的消耗。 二、HTTP 协议处理 在 Netty 中,HTTP 协议的处理主要依赖于 `...

    keycloak-login-api-1.0-alpha-3.zip

    描述中提到了"netty-ftp-receiver.zip",这是一个基于Netty实现的FTP接收器,实现了RFC 959“文件传输协议(FTP)”。Netty是一个高性能、异步事件驱动的网络应用程序框架,常用于构建可扩展且高效的服务器和客户端...

    SlwRest-1.0(Super Lightweight Rest)超轻量RESTful框架

    它可能是基于Servlet或Netty等轻量级网络库实现,以保证高效运行。 4. **slw-restclient-1.0.jar**:客户端库,方便开发者在应用程序中调用远程RESTful服务。它提供了简单的API来发起HTTP请求,处理响应,简化了...

    sip-communicator-1.0-src源程序

    SIP(Session Initiation Protocol)通信器是一款基于开源的、跨平台的VoIP(Voice over Internet Protocol)和即时通讯软件,其1.0版本的源代码是理解SIP通信协议及其在实际应用中的实现的关键。本文将深入探讨这个...

    sentry-1.0-RC37.zip

    它基于JBoss Netty,一个高性能的异步事件驱动的网络应用程序框架,确保了服务的高并发处理能力。RestExpress通过清晰的API设计,允许开发者以声明式的方式定义路由,极大地提高了开发效率。同时,它支持多种序列化...

    websocket-1.0-SNAPSHOT.jar

    这是一个基于netty的websocket项目,你可以直接使用他或者扩展他。 如果喜欢的话可以和我一起开发他。 加入我们或者其他问题都可以发送 给我的邮箱1003523958@qq.com 简单的介绍: ws://localhost:8848/1 代表连接id...

    java开源包3

    HttpAsyncClient 是一个异步的 HTTP 客户端开发包,基于 HttpCore NIO 和 HttpClient 组件。HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP...

    Apache_Mina_Server_ 深入教程V1.0

    Apache Mina Server 深入教程V1.0是一份详尽的指南,旨在帮助开发者深入理解并有效地利用Apache Mina构建高性能、可扩展的网络应用程序。Apache Mina(Model-View-Controller for Network Applications)是一个Java...

    联通SGIP1.2接口Java版实现(客户端与服务端)

    SGIP1.2接口是基于SGIP1.0的升级版本,主要优化了数据传输的效率和安全性,增加了更多的控制命令和功能,比如支持长短信、彩信、WAP Push等服务。Java版实现意味着开发者可以利用Java的强大特性和丰富的库来处理这些...

    java网络框架对比报告.pdf

    ### Java网络框架对比报告知识点详述 #### 一、引言 在Java网络开发领域,选择合适...Mina更适合需要快速开发的场景,而Netty则更适合对性能要求极高且需要高度定制的应用。根据项目的具体需求选择合适的框架是关键。

    leo-im-server:leo-im服务端

    Leo-IM是基于Java语言、Netty框架、Vue+Element-UI开发的轻量级IM,服务端可独立运行(无需部署到web容器),HTTP服务和Socket服务可分开部署,使用基于Netty扩展的RESTful框架提供Web服务,简单易用,方便扩展。...

Global site tag (gtag.js) - Google Analytics