`
cqupt123
  • 浏览: 66812 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

netty从入门到精通——入门篇

阅读更多
  本文通过一个简单的例子,来讲解netty最基本的用法。
  首先,创建工程mynetty,引入netty的依赖包:
 
  <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty</artifactId>
      <version>3.5.6.Final</version>
  </dependency>
  

  创建好之后,开始编码:
1. 新建类NettyServer
package com.netty.intr;

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;

public class NettyServer {
	final static int port = 8080;

	public static void main(String[] args) {
		Server server = new Server();
		server.config(port);
		server.start();
	}
}

class Server {
	ServerBootstrap bootstrap;
	Channel parentChannel;
	InetSocketAddress localAddress;
	MyChannelHandler channelHandler = new MyChannelHandler();

	Server() {
		bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
				Executors.newCachedThreadPool(), Executors
						.newCachedThreadPool()));
		bootstrap.setOption("reuseAddress", true);
		bootstrap.setOption("child.tcpNoDelay", true);
		bootstrap.setOption("child.soLinger", 2);
		bootstrap.getPipeline().addLast("servercnfactory", channelHandler);
	}

	void config(int port) {
		this.localAddress = new InetSocketAddress(port);
	}

	void start() {
		parentChannel = bootstrap.bind(localAddress);
	}

	class MyChannelHandler extends SimpleChannelHandler {

		@Override
		public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e)
				throws Exception {
			System.out.println("Channel closed " + e);
		}

		@Override
		public void channelConnected(ChannelHandlerContext ctx,
				ChannelStateEvent e) throws Exception {
			System.out.println("Channel connected " + e);
		}

		@Override
		public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
				throws Exception {
			try {
				System.out.println("New message " + e.toString() + " from "
						+ ctx.getChannel());
				processMessage(e);
			} catch (Exception ex) {
				ex.printStackTrace();
				throw ex;
			}
		}

		private void processMessage(MessageEvent e) {
			Channel ch = e.getChannel();
			ch.write(e.getMessage());
		}
	}
}


2. 运行程序,打开命令行,输入:telnet 127.0.0.1 8080,在控制台会出现:
Channel connected [id: 0x29b7df26, /127.0.0.1:51554 => /127.0.0.1:8080] CONNECTED: /127.0.0.1:51554

表示有客户端连接到了server,并且打印出了客户端的信息。

3. 任意输入一个字符(如:a),在控制台会出现:
New message [id: 0x29b7df26, /127.0.0.1:51554 => /127.0.0.1:8080] RECEIVED: BigEndianHeapChannelBuffer(ridx=0, widx=1, cap=1) from [id: 0x29b7df26, /127.0.0.1:51554 => /127.0.0.1:8080]

这就意味着Server收到了来自client的message,打印出了客户端信息以及message的基本信息。而在命令行窗口会出现我们刚才输入的字符a。

4. 当关闭命令行窗口时,控制台会出现:
Channel closed [id: 0x29b7df26, /127.0.0.1:51554 :> /127.0.0.1:8080] CLOSED

表示连接已经关闭了。


  从现象到本质,下面来做简单的解释。服务器的主要逻辑都放在类Server中的,所以来看一下该类中是如何启动服务器、接收消息的。
  首先是构造方法:
1. 初始化ServerBootstrap,并注入NioServerSocketChannelFactory,用于创建通道(channel)等。从这里可以看出是通过Nio的方式来处理的,factory中放入两个线程池,主要用于接收connect和message。
bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
				Executors.newCachedThreadPool(), Executors
						.newCachedThreadPool()));


2. 为通道以及子通道(带前缀”child.”)设置相关的属性(socket属性),此处暂不详细介绍。
bootstrap.setOption("reuseAddress", true);
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.soLinger", 2);


3. 向ChannelPipline中添加处理器(ChannelHandler),用于处理连接和消息。
bootstrap.getPipeline().addLast("servercnfactory", channelHandler);

  MyHandler继承了SimpleChannelHandler,并且重写了方法:channelClosed、channelConnected、messageReseived,方法的参数为ChannelHandlerContext和ChannelEvent。ChannelHandlerContext为通道上下文,event中便带有消息和连接的信息。
  channelConnected方法在接到来自客户端的连接时触发(这里只是打印了收到的连接的信息),所以在执行telnet命令时,看到控制台会有相应的输出。
  MessageReseived方法在接收到消息是会触发,这里会交给processMessage方法处理,这里只是简单的把接收到的信息写回客户端。所以在命令行窗口中会看到我们写入的字母信息。
  ChannelClosed方法在关闭连接的时候被调用,当我们关闭命令行窗口的时候,就会看到控制台打印出相应的信息。
  当然,ChannelHander的接口不止这么三个,除了SimpleChannelHandler以外还有很特殊的实现,这里只做简单介绍。


  初始化完成之后,我们调用server.config(int port)方法注入需要绑定的端口信息,这里为8080。

  最后调用server.start()方法,服务器便启动起来了。
分享到:
评论
4 楼 真好玩 2016-04-05  
好 精 通 啊.....
3 楼 真好玩 2016-04-05  
2 楼 qja 2014-09-03  
看完了。精通了。
1 楼 Rejoy 2014-06-05  
  这也叫入门到精通。。。

相关推荐

    netty从入门到精通所有代码

    这个“Netty 从入门到精通所有代码”压缩包包含了一系列的示例代码,帮助开发者逐步理解并掌握 Netty 的核心概念和实际应用。 1. **Netty 基本概念** - **NIO (Non-blocking I/O)**:Netty 是基于 Java NIO 构建的...

    netty入门到精通.txt

    根据提供的文件信息“netty入门到精通”,我们可以深入探讨Netty框架的相关知识点,包括其基本概念、核心组件、应用场景以及如何逐步掌握这项技术。 ### Netty框架简介 Netty是一款高性能、异步事件驱动的网络应用...

    Netty入门教程文档

    Netty入门教程文档 Netty是Java的网络编程框架,广泛应用于数据采集服务中,本文将对Netty的基本概念和应用进行详细介绍,并将其与ETL技术结合,讲解如何使用Netty进行数据流转和处理。 1. ETL概述 ETL(Extract...

    Netty 框架学习 —— 第一个 Netty 应用(csdn)————程序.pdf

    在本篇关于“Netty框架学习——第一个Netty应用”的文章中,我们将深入理解如何使用Netty构建一个简单的Echo服务器和客户端。Netty是一个高性能、异步事件驱动的网络应用程序框架,广泛应用于Java领域的服务器开发。...

    Netty全套学习资源(包括源码、笔记、学习文档等)

    通过阅读源码,我们可以了解到 Netty 如何实现高效的网络通信,例如它的非阻塞 I/O 模型、事件驱动架构、内存池管理以及编码解码器等核心组件。其中,Channel、EventLoop、ByteBuf 等关键类是理解 Netty 的基础,而 ...

    读书笔记:《Netty实战》源代码——Scala版.zip

    读书笔记:《Netty实战》源代码——Scala版

    Netty-In-Action中文版.pdf

    《Netty in Action》是一本深入探讨Netty框架的中文指南,它为读者提供了全面了解和熟练使用Netty所需的知识。Netty是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。...

    Netty 快速入门系列-源码

    Netty快速入门系列源码, 参考 https://blog.csdn.net/netcobol Netty是一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 Netty是...

    高性能网络通信框架 Netty从入门到核心源码剖析

    高性能网络通信框架_Netty从入门到核心源码剖析

    netty权威指南 PDF电子书下载 带目录书签 完整版

    netty权威指南 PDF电子书下载 带目录书签 完整版,下载

    高性能网络通信框架Netty从入门到核心源码剖析.rar

    本资源《高性能网络通信框架Netty从入门到核心源码剖析》将带领读者逐步了解并深入掌握Netty的使用和设计原理。 一、Netty入门 1. 安装与环境配置:介绍如何在Java项目中引入Netty依赖,以及相关的构建工具如Maven...

    netty电子书

    Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个基于NIO的客户,服务器端编程框架,...

    Netty+入门与实战:仿写微信+IM+即时通讯系统.rar

    该压缩包包含的章节HTML文件,将逐步引导你从基础到高级,深入理解Netty的使用方法,并通过实际的IM系统项目实践,巩固所学知识。每一章都可能涵盖Netty的特定组件或功能,以及在即时通讯系统中如何应用这些知识。 ...

    读书笔记:Netty从入门到实战深入Netty底层原理结合实战打造百万级连接的IM通讯软件。.zip

    读书笔记:Netty从入门到实战深入Netty底层原理结合实战打造百万级连接的IM通讯软件。

    Netty从入门到实战,深入Netty底层原理,结合实战,打造百万级连接的IM通讯软件。-netty_study.zip

    Netty从入门到实战,深入Netty底层原理,结合实战,打造百万级连接的IM通讯软件。-netty_study

    Netty权威指南 PDF电子书下载 带目录书签 完整版

    这本书包含了从基础到高级的所有关键知识点,旨在帮助开发者提升网络编程的效率和质量。 在书中,你可以了解到: 1. **Netty简介**:了解Netty的基本概念,包括它的设计理念、核心组件以及与传统Java网络API的区别...

    netty快速入门教程3-4集 共12集

    总的来说,这12集的Netty快速入门教程将带你从基础到进阶,全面理解Netty框架的核心组件和用法。通过学习客户端的构建和Netty线程模型,你将具备使用Netty开发高效、可靠网络应用的能力。不论是构建TCP、UDP服务,...

    Netty-入门Netty编码

    这个教程将引导我们入门 Netty 编码,让我们深入理解其核心概念和实际应用。 首先,Netty 的核心是其设计模式,即 Reactor 模式,也称为事件驱动模型。Reactor 模式允许 Netty 高效地处理大量并发连接,通过非阻塞 ...

    netty从入门到进阶的基础文档

    这个基础文档将带你从入门到进阶,深入理解Netty的核心概念和应用。 1. **入门理解** - **什么是Netty?** Netty是由JBOSS提供的一个Java开源框架,主要用于开发高并发、低延迟的网络应用,如TCP、UDP、HTTP、...

    Netty权威指南完整版高清pdf

    《Netty权威指南》是一本深入探讨Netty框架的详细教程,旨在帮助读者全面理解并熟练运用Netty进行高性能网络应用开发。Netty是Java领域的一款开源、异步事件驱动的网络应用程序框架,广泛应用于高性能服务器和客户端...

Global site tag (gtag.js) - Google Analytics