欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

1.Netty入门

程序员文章站 2022-09-22 08:05:07
Netty入门 1.Netty介绍 (1)百度百科介绍: Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户、服务器端编程框架,使用Netty ......

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.

1.Netty入门

(3)参考资料:

  1. 参考书籍:netty实战(norman maurer & marvin allen wolfthal)
  2. 参考官方文档:https://netty.io/wiki/user-guide.html
  3. 参考网址:https://ifeve.com/tag/netty/

2.程序功能概述

1.Netty入门

客户端向服务器发送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!