zoukankan      html  css  js  c++  java
  • Netty入门

    1.Netty介绍

    (1)百度百科介绍:

    Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。
    也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty 可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。
    “快速”和“简单”并不用产生维护性或性能上的问题。Netty 是一个吸收了多种协议(包括FTP、SMTP、HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty 成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和伸缩性。

    (2)官网介绍:netty.io

    Netty is an asynchronous event-driven network application framework
    for rapid development of maintainable high performance protocol servers & clients.

    (3)参考资料:

    1. 参考书籍:Netty实战(Norman Maurer & Marvin Allen Wolfthal)
    2. 参考官方文档:https://netty.io/wiki/user-guide.html
    3. 参考网址:https://ifeve.com/tag/netty/

    2.程序功能概述

    客户端向服务器发送HelloNetty-Server!服务器向客户端返回Hello Netty-Client!

    3.程序实现

    1. 服务端ChannelHandler

      package com.xm.netty;
      
      import io.netty.buffer.ByteBuf;
      import io.netty.buffer.Unpooled;
      import io.netty.channel.ChannelFutureListener;
      import io.netty.channel.ChannelHandlerContext;
      import io.netty.channel.ChannelInboundHandlerAdapter;
      import io.netty.util.CharsetUtil;
      
      public class ServerHandler extends ChannelInboundHandlerAdapter {
      
       @Override
       public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
           ByteBuf in = (ByteBuf) msg;
           System.out.println("服务器接收:"+in.toString(CharsetUtil.UTF_8));
           in.clear();
           String str = "Hello Netty-Client!";
           in.writeBytes(str.getBytes());
           ctx.write(in);
       }
      
       @Override
       public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
           ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
       }   
      
       @Override
       public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
           cause.printStackTrace();
           ctx.close();
       }
      
      }
      
    2. 服务端Server

      package com.xm.netty;
      
      import java.net.InetSocketAddress;
      
      import io.netty.bootstrap.ServerBootstrap;
      import io.netty.channel.Channel;
      import io.netty.channel.ChannelFuture;
      import io.netty.channel.ChannelInitializer;
      import io.netty.channel.EventLoopGroup;
      import io.netty.channel.nio.NioEventLoopGroup;
      import io.netty.channel.socket.nio.NioServerSocketChannel;
      
      public class Server {
      
       private final int port;
      
       public Server(int port) {
           this.port = port;
       }
      
       public static void main(String[] args) {
           int port = 8989;
           try {
               new Server(port).start();
           } catch (InterruptedException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
           }
       }
      
       private void start() throws InterruptedException {
            final ServerHandler serverHandler = new ServerHandler();
            EventLoopGroup group = new NioEventLoopGroup();
            try {
               ServerBootstrap bootstrap = new ServerBootstrap();
                bootstrap
                       .group(group)
                       .channel(NioServerSocketChannel.class)
                       .localAddress(new InetSocketAddress( port))
                       .childHandler(new ChannelInitializer() {
                           @Override
                           protected void initChannel(Channel ch) throws Exception {
                               ch.pipeline().addLast(serverHandler);
                           }
                       });
                ChannelFuture future = bootstrap.bind().sync();
                future.channel().closeFuture().sync();
           } finally {
               group.shutdownGracefully().sync();
           }
      
       }
      
      }
      
    3. 客户端ChannelHandler

      package com.xm.netty;
      
      import io.netty.buffer.ByteBuf;
      import io.netty.buffer.Unpooled;
      import io.netty.channel.ChannelHandlerContext;
      import io.netty.channel.SimpleChannelInboundHandler;
      import io.netty.util.CharsetUtil;
      
      public class ClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
      
       @Override
       public void channelActive(ChannelHandlerContext ctx) throws Exception {
           ctx.writeAndFlush(Unpooled.copiedBuffer("Hello Netty-Server!",CharsetUtil.UTF_8));
       }
      
       @Override
       protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
           System.out.println("客户端接收到消息:"+msg.toString(CharsetUtil.UTF_8));
       }
      
       @Override
       public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
           cause.printStackTrace();
           ctx.close();
       }
      
      }
      
    4. 客户端Client

      package com.xm.netty;
      
      import io.netty.bootstrap.Bootstrap;
      import io.netty.channel.ChannelFuture;
      import io.netty.channel.ChannelInitializer;
      import io.netty.channel.EventLoopGroup;
      import io.netty.channel.nio.NioEventLoopGroup;
      import io.netty.channel.socket.SocketChannel;
      import io.netty.channel.socket.nio.NioSocketChannel;
      
      public class Client {
      
       private final int port;
       private final String host;
      
      
      
       public Client(int port, String host) {
           this.port = port;
           this.host = host;
       }
      
      
      
       public static void main(String[] args) {
      
           String host = "127.0.0.1";
           int port = 8989;
           try {
               new Client(port, host).start();
           } catch (InterruptedException e) {
               // TODO Auto-generated catch block
               e.printStackTrace();
           }
      
       }
      
      
      
       private void start() throws InterruptedException {
           EventLoopGroup group = new NioEventLoopGroup();
           try {
               Bootstrap bootstrap = new Bootstrap();
               bootstrap
                       .group(group)
                       .channel(NioSocketChannel.class)
                       .remoteAddress(host, port)
                       .handler(new ChannelInitializer<SocketChannel>() {
      
                           @Override
                           protected void initChannel(SocketChannel ch) throws Exception {
                               ch.pipeline().addLast(new ClientHandler());
                           }
      
                       });
      
               ChannelFuture future = bootstrap.connect().sync();
               future.channel().closeFuture().sync();
           } finally {
               group.shutdownGracefully().sync();
           }
      
       }
      
      }
      
    5. 导入依赖

      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.xm</groupId>
        <artifactId>netty</artifactId>
        <version>0.0.1-SNAPSHOT</version>
      
        <dependencies>
      
      
      <dependency>
          <groupId>io.netty</groupId>
          <artifactId>netty-all</artifactId>
          <version>4.1.16.Final</version>
      </dependency>
      
      
        </dependencies>
      </project>

    4.运行结果:

    1. 服务端:

      服务器接收:Hello Netty-Server!

    2. 客户端:

      客户端接收到消息:Hello Netty-Client!

  • 相关阅读:
    算法第4章实践报告
    避免商品超卖的4种方案
    PHP 之获取Windows下CPU、内存的使用率
    XunSearch(讯搜)的使用教程步骤
    curl传递二维数组,打印没有数据,只显示Array
    使用Postfix和Dovecot收发电子邮件
    Mybatis中使用association进行关联的几种方式
    两个服务器之间文件互传
    php-fpm 高并发 参数调整
    高并发linux内核网络参数调优
  • 原文地址:https://www.cnblogs.com/wangjintao-0623/p/9771317.html
Copyright © 2011-2022 走看看