BusiHandler

  1. public class BusiHandler extends ChannelInboundHandlerAdapter {
  2. /**
  3. * 发送的返回值
  4. * @param ctx 返回
  5. * @param context 消息
  6. * @param status 状态
  7. */
  8. private void send(ChannelHandlerContext ctx, String context,
  9. HttpResponseStatus status) {
  10. FullHttpResponse response = new DefaultFullHttpResponse(
  11. HttpVersion.HTTP_1_1,status,
  12. Unpooled.copiedBuffer(context,CharsetUtil.UTF_8)
  13. );
  14. response.headers().set(HttpHeaderNames.CONTENT_TYPE,"text/plain;charset=UTF-8");
  15. ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE);
  16. }
  17. @Override
  18. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  19. String result="";
  20. FullHttpRequest httpRequest = (FullHttpRequest)msg;
  21. System.out.println(httpRequest.headers());
  22. try{
  23. //获取路径
  24. String path=httpRequest.uri();
  25. //获取body
  26. String body = httpRequest.content().toString(CharsetUtil.UTF_8);
  27. //获取请求方法
  28. HttpMethod method=httpRequest.method();
  29. System.out.println("接收到:"+method+" 请求");
  30. //如果不是这个路径,就直接返回错误
  31. if(!"/test".equalsIgnoreCase(path)){
  32. result="非法请求!"+path;
  33. send(ctx,result,HttpResponseStatus.BAD_REQUEST);
  34. return;
  35. }
  36. //如果是GET请求
  37. if(HttpMethod.GET.equals(method)){
  38. //接受到的消息,做业务逻辑处理...
  39. System.out.println("body:"+body);
  40. result="GET请求,应答:"+RespConstant.getNews();
  41. send(ctx,result,HttpResponseStatus.OK);
  42. return;
  43. }
  44. //如果是其他类型请求,如post
  45. if(HttpMethod.POST.equals(method)){
  46. //接受到的消息,做业务逻辑处理...
  47. //....
  48. return;
  49. }
  50. }catch(Exception e){
  51. System.out.println("处理请求失败!");
  52. e.printStackTrace();
  53. }finally{
  54. //释放请求
  55. httpRequest.release();
  56. }
  57. }
  58. /*
  59. * 建立连接时,返回消息
  60. */
  61. @Override
  62. public void channelActive(ChannelHandlerContext ctx) throws Exception {
  63. System.out.println("连接的客户端地址:" + ctx.channel().remoteAddress());
  64. }
  65. }

HttpServer

  1. public class HttpServer {
  2. public static final int port = 6789; //设置服务端端口
  3. private static EventLoopGroup group = new NioEventLoopGroup(); // 通过nio方式来接收连接和处理连接
  4. private static ServerBootstrap b = new ServerBootstrap();
  5. private static final boolean SSL = false;/*是否开启SSL模式*/
  6. /**
  7. * Netty创建全部都是实现自AbstractBootstrap。
  8. * 客户端的是Bootstrap,服务端的则是ServerBootstrap。
  9. **/
  10. public static void main(String[] args) throws Exception {
  11. final SslContext sslCtx;
  12. if(SSL){
  13. SelfSignedCertificate ssc = new SelfSignedCertificate();
  14. sslCtx = SslContextBuilder.forServer(ssc.certificate(),
  15. ssc.privateKey()).build();
  16. }else{
  17. sslCtx = null;
  18. }
  19. try {
  20. b.group(group);
  21. b.channel(NioServerSocketChannel.class);
  22. b.childHandler(new ServerHandlerInit(sslCtx)); //设置过滤器
  23. // 服务器绑定端口监听
  24. ChannelFuture f = b.bind(port).sync();
  25. System.out.println("服务端启动成功,端口是:"+port);
  26. // 监听服务器关闭监听
  27. f.channel().closeFuture().sync();
  28. } finally {
  29. group.shutdownGracefully(); //关闭EventLoopGroup,释放掉所有资源包括创建的线程
  30. }
  31. }
  32. }

RespConstant

  1. public class RespConstant {
  2. private static final String[] NEWS = {
  3. "她那时候还太年轻,不知道所有命运赠送的礼物,早已在暗中标好了价格。——斯蒂芬·茨威格《断头皇后》",
  4. "这是一个最好的时代,也是一个最坏的时代;这是一个智慧的年代,这是一个愚蠢的年代;\n" +
  5. "这是一个信任的时期,这是一个怀疑的时期;这是一个光明的季节,这是一个黑暗的季节;\n" +
  6. "这是希望之春,这是失望之冬;人们面前应有尽有,人们面前一无所有;\n" +
  7. "人们正踏上天堂之路,人们正走向地狱之门。 —— 狄更斯《双城记》",
  8. };
  9. private static final Random R = new Random();
  10. public static String getNews(){
  11. return NEWS[R.nextInt(NEWS.length)];
  12. }
  13. }

ServerHandlerInit

  1. public class ServerHandlerInit extends ChannelInitializer<SocketChannel> {
  2. private final SslContext sslCtx;
  3. public ServerHandlerInit(SslContext sslCtx) {
  4. this.sslCtx = sslCtx;
  5. }
  6. @Override
  7. protected void initChannel(SocketChannel ch) throws Exception {
  8. ChannelPipeline ph = ch.pipeline();
  9. if(sslCtx!=null){
  10. ph.addLast(sslCtx.newHandler(ch.alloc()));
  11. }
  12. /*把应答报文 编码*/
  13. ph.addLast("encoder",new HttpResponseEncoder());
  14. /*把请求报文 解码*/
  15. ph.addLast("decoder",new HttpRequestDecoder());
  16. /*聚合http为一个完整的报文*/
  17. ph.addLast("aggregator",new HttpObjectAggregator(10*1024*1024));
  18. /*把应答报文 压缩,非必要*/
  19. ph.addLast("compressor",new HttpContentCompressor());
  20. ph.addLast(new BusiHandler());
  21. }
  22. }