zoukankan      html  css  js  c++  java
  • 1.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.

    (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!

  • 相关阅读:
    算法——(转)动态规划入门
    iOS学习——(转)多线程
    iOS崩溃日志ips文件解析
    iOS学习——核心动画
    iOS学习——核心动画之Layer基础
    iOS学习——Quartz2D学习之UIKit绘制
    iOS学习——Quartz2D学习之DrawRect
    iOS模拟器使用
    (转)浅谈Session与Cookie的区别与联系
    Android Studio 受不了了
  • 原文地址:https://www.cnblogs.com/TimerHotel/p/netty01.html
Copyright © 2011-2022 走看看