`
hpgary
  • 浏览: 82022 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

netty 之Hello Word

    博客分类:
  • Java
 
阅读更多

如果你还不知道Netty是做什么的能做什么。那可以先简单的搜索了解一下。我Netty是一个NIO的框架,可以用于开发分布式的Java程序。具体能做什么,各位可以尽量发挥想象。技术,是服务于人而不是局限住人的。

 

如果你已经万事具备,那么我们先从一段代码开始。程序员们习惯的上手第一步,自然是"Hello world",不过Netty官网的例子却偏偏抛弃了"Hello world"。那我们就自己写一个最简单的"Hello world"的例子,作为上手。

 

1、首先创建 DiscardServerHandler 服务器端处理消息类: 

package com.hpgary.netty4;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;
/**
 * netty处理消息Handler
 * */
public class DiscardServerHandler extends SimpleChannelInboundHandler<ByteBuf> {

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		System.out.println("异常");
	}

	@Override
	protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
		/*打印接收的消息*/
		System.out.println(msg.toString(CharsetUtil.UTF_8));
		/*因为是网络传输,所以使用directBuffer, 使用 PooledByteBufAllocator ByteBuf池创建*/
		ByteBuf byteBuf = ctx.alloc().directBuffer();
		byteBuf.writeBytes("I got message\n".getBytes());
		ctx.writeAndFlush(byteBuf);
	}
	
	@Override
	public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
		super.channelReadComplete(ctx);
	}

	@Override
	public void channelInactive(ChannelHandlerContext ctx) throws Exception {
		super.channelInactive(ctx);
		
		ctx.writeAndFlush("welcome\n");
	}

	@Override
	public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {

	}

}

 2、创建启动类:

package com.hpgary.netty4;

import java.net.InetAddress;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;

public class DiscardServer {

	public static void main(String[] args) throws Exception {
		EventLoopGroup bossGroup = new NioEventLoopGroup();
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		ServerBootstrap b = new ServerBootstrap();
		/**
		 * 这一步是必须的,如果没有设置group将会报java.lang.IllegalStateException: group not
		 * set异常
		 */
		b.group(bossGroup, workerGroup);
		/**
		 * ServerSocketChannel以NIO的selector为基础进行实现的,用来接收新的连接
		 * 这里告诉Channel如何获取新的连接.
		 */
		b.channel(NioServerSocketChannel.class);
		/***
         * 这里的事件处理类经常会被用来处理一个最近的已经接收的Channel。
         * ChannelInitializer是一个特殊的处理类,
         * 他的目的是帮助使用者配置一个新的Channel。
         * 也许你想通过增加一些处理类比如NettyServerHandler来配置一个新的Channel
         * 或者其对应的ChannelPipeline来实现你的网络程序。
         * 当你的程序变的复杂时,可能你会增加更多的处理类到pipline上,
         * 然后提取这些匿名类到最顶层的类上。
         */
		b.childHandler(new ChannelInitializer<SocketChannel>() {
			@Override
			protected void initChannel(SocketChannel ch) throws Exception {
				ChannelPipeline pipeline = ch.pipeline();
				pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
				/*如果是传递和接收的是String字符串,就需要配置解压和压缩工具*/
				// pipeline.addLast("decoder", new StringDecoder());
				// pipeline.addLast("encoder", new StringEncoder());
				/*配置接收数据的handler*/
				pipeline.addLast("handler", new DiscardServerHandler());
			}
		});
		/*服务器端兵丁IP和端口,0.0.0.0表示任何IP都可以链接*/
		ChannelFuture future = b.bind(InetAddress.getByName("0.0.0.0"), 8086).sync();
		future.channel().closeFuture().sync();
	}
}

 

3、创建客户端处理数据handler

package com.hpgary.netty4;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.CharsetUtil;

public class DiscardClientHandler extends SimpleChannelInboundHandler<ByteBuf> {

	@Override
	protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
		System.out.println(msg.toString(CharsetUtil.UTF_8));
	}

}

 4、客户端启动程序

package com.hpgary.netty4;

import java.io.BufferedReader;
import java.io.InputStreamReader;

import org.apache.commons.lang3.StringUtils;

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
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.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.Delimiters;

public class DiscardClient {

	public static void main(String[] args) throws Exception {
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		Bootstrap b = new Bootstrap();

		b.group(workerGroup);
		
		b.channel(NioSocketChannel.class);
		
		b.handler(new ChannelInitializer<SocketChannel>() {
			@Override
			public void initChannel(SocketChannel ch) throws Exception {
				ChannelPipeline pipeline = ch.pipeline();
				pipeline.addLast("framer", new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
				pipeline.addLast("handler", new DiscardClientHandler());
			}
		});
		Channel ch = b.connect("127.0.0.1", 8086).sync().channel();
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in) ) ;
		while (true) {
			String line = in.readLine();
			if (line == null) {
				continue;
			}
			ByteBuf buf = Unpooled.directBuffer(128);
			buf.writeBytes((line + StringUtils.LF).getBytes());
			ch.writeAndFlush(buf);
		}
	}
}

 

分享到:
评论

相关推荐

    Netty之helloworld示列

    在本示例中,“Netty之helloworld”旨在为初学者提供一个简单的入门教程,帮助理解Netty的工作原理和基本用法。 首先,Netty的核心概念包括Bootstrap(引导类)、Channel(通道)、Handler(处理器)和EventLoop...

    netty之hello world

    在本文中,我们将深入探讨Netty的基本概念,通过“Hello World”范例来理解其工作原理。 首先,让我们理解Netty的核心概念。Netty基于Java NIO(非阻塞I/O)构建,提供了高级API来处理网络通信。它包含以下几个关键...

    Netty HelloWorld + HeartBeat Demo

    在这个“Netty HelloWorld + HeartBeat Demo”中,我们将深入理解Netty的基本用法以及如何实现心跳机制。 首先,让我们从Netty HelloWorld Demo开始。这个Demo通常用于展示如何使用Netty创建一个简单的TCP服务器和...

    Netty进阶之路-跟着案例学Netty

    《Netty进阶之路-跟着案例学Netty》是由知名技术专家李林峰撰写的一本专为Java开发者深入理解Netty框架而准备的书籍。这本书旨在通过实例教学,帮助读者全面掌握Netty的核心特性和实战技巧,提升网络编程的能力。 ...

    《Netty进阶之路 跟着案例学Netty》.rar

    Java进阶技术-netty进阶之路

    《Netty进阶之路 跟着案例学Netty》_李林锋_

    Netty进阶之路 跟着案例学Netty 整本书无密码,Netty进阶之路 跟着案例学Netty

    Netty进阶之路:跟着案例学Netty 完整版.pdf

    《Netty进阶之路:跟着案例学Netty》中的案例涵盖了Netty的启动和停止、内存、并发多线程、性能、可靠性、安全等方面,囊括了Netty绝大多数常用的功能及容易让人犯错的地方。在案例的分析过程中,还穿插讲解了Netty...

    Netty in action中文版

    【Netty 介绍】 Netty 是一款基于 Java NIO 的高性能、易用的网络应用程序框架,主要用于构建服务器和客户端的网络通信系统。Netty 的设计目标是简化网络编程的复杂性,提供高度抽象的API,使得开发者能够快速、...

    Netty在IDEA中搭建HelloWorld服务端并对Netty执行流程与重要组件进行介绍示例代码.rar

    Netty在IDEA中搭建HelloWorld服务端并对Netty执行流程与重要组件进行介绍示例代码;Netty在IDEA中搭建HelloWorld服务端并对Netty执行流程与重要组件进行介绍示例代码

    Netty权威指南

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

    Netty初步学习-HelloNetty.rar

    在"Netty初步学习-HelloNetty.rar"这个压缩包中,我们可以看到包含"第二课netty服务端"的资源,这表明我们将学习如何构建一个简单的 Netty 服务端。下面将详细解释 Netty 的核心概念和步骤,以帮助你入门。 1. **...

    netty之UDP协议开发

    在这个“netty之UDP协议开发”的项目中,我们将探讨如何使用Netty实现基于UDP(用户数据报协议)的应用。 UDP是一种无连接的、不可靠的传输层协议,它不保证数据包的顺序或完整性,但其速度较快,适合于对实时性...

    高清_书签_Netty进阶之路 跟着案例学Netty.zip

    精选自1000多个一线业务实际案例,从原理到实践全景式讲解Netty项目实践,快速领悟Netty专家花大量时间积累的经验,提高编程水平及分析解决问题的能力,《Netty木又威指南》作者力作,众专家力荐 Netty将Java NIO...

    hello netty代码练习

    这个"hello netty"的代码练习旨在帮助开发者深入理解 Netty 的工作原理,通过实践来加强理论知识。 在实践中,我们通常会遵循以下步骤来创建一个简单的 Netty 应用: 1. **配置**:首先,我们需要配置服务器和...

    Netty实战.epub_netty实战epub_netty实战epub_netty_

    《Netty实战》这本书是针对Java网络编程框架Netty的一本深入实践教程,旨在帮助读者掌握Netty的核心特性和实际应用。Netty是一款高性能、异步事件驱动的网络应用程序框架,广泛应用于各种分布式系统、微服务架构以及...

    跟闪电侠学Netty:Netty即时聊天实战与底层原理-book-netty.zip

    《跟闪电侠学Netty:Netty即时聊天实战与底层原理》是一本深入浅出的Netty技术指南,旨在...通过学习这本书,你不仅可以学会Netty的基本使用,还能深入了解其设计思想和优化手段,为你的Java网络编程之路打下坚实基础。

    Netty基础,用于学习Netty,参考黑马程序员的netty教程

    Netty基础,用于学习Netty,参考黑马程序员的netty教程

    网络编程之Netty一站式精讲.rar

    Netty是Java领域的一款高性能、异步事件驱动的网络应用框架,主要用于快速开发可维护的高性能协议服务器和客户端。在本精讲中,我们将深入探讨Netty的核心概念、设计模式以及实际应用场景,帮助你全面理解并掌握...

    Netty实战 电子版.pdf_java_netty_服务器_

    《Netty实战》是针对Java开发者的一本技术指南,它深入介绍了如何利用Netty这个高性能、异步事件驱动的网络应用程序框架来构建高效且可扩展的网络应用。Netty不仅简化了网络编程的复杂性,还提供了丰富的特性和组件...

    netty学习之ServerChannel

    Netty学习之ServerChannel Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在本篇中,我们将深入探讨ServerChannel这一核心概念,它是Netty中用于接收客户端...

Global site tag (gtag.js) - Google Analytics