Netty笔记一(可以运行看到结果的简单例子)

本文介绍如何使用Netty框架编写一个简单的Hello World程序,包括创建Maven项目、引入依赖、编写代码并运行程序,使初学者能够快速了解Netty的运行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近一段时间一直研究聊天程序,学习了nio的知识,以后会和大家分享的,今天写了一个可以运行看到结果的netty helloworld程序,这个程序虽然简单,但从这个程序可以知道netty的运行流程,希望对初学者有所帮助。

第一步:建立一个maven项目,或者读者可以自己导入netty依赖包

<dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty</artifactId>
      <version>3.5.6.Final</version>
 </dependency>

 现在netty 4.0已经出来了,因为3.x版本的资料比较多有利于学习,先从3.x开始了,以后会继续出4.x的学习笔记的,呵呵,上程序了

第二步:复制下面代码到项目中

 

package com.my.day1;

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.ChannelPipeline;
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;
import org.jboss.netty.handler.codec.string.StringDecoder;
import org.jboss.netty.handler.codec.string.StringEncoder;

/**   
 * @Title: NettyDemo.java 
 * @Package com.my.day1 
 * @Description: 一个类完整运行netty,运行就能看到结果
 * @author jimmy lovelyxuehanxin@163.com   
 * @date 2013-4-16 下午9:38:29 
 */
public class NettyDemo {
	public static void main(String[] args) {
		NioServer server = new NioServer();
	}
}

class NioServer{
	ServerBootstrap bootstrap;
	Channel parentChannel;
	InetSocketAddress localAddress;
	MyChannelHandler channelHandler = new MyChannelHandler();
	public NioServer(){
	bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(
			Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
	
	
	ChannelPipeline pineline = bootstrap.getPipeline();
	// String格式字符串解码写的时候都会经过这个过滤器处理
    pineline.addLast("encode", new StringEncoder());
    // 接受信息的时候会被处理
	pineline.addLast("decode", new StringDecoder());
	// 自定义处理类,我们的业务一般从这个类开始
	pineline.addLast("servercnfactory", channelHandler);
	bootstrap.bind(new InetSocketAddress(8080));
	}
	
}
// 处理channel中的数据,SimpleChannelHandler帮我们实现好了很多有用户的方法这里就只重写了几个方法
class MyChannelHandler extends SimpleChannelHandler{

	// netty默认信息接受入口
	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
			throws Exception {
		System.out.println("接受到的信息" + e.getMessage());
		// 返回信息可以在dos对话框中看到自己输的内容
		e.getChannel().write(e.getMessage());
		super.messageReceived(ctx, e);
	}

	@Override
	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)
			throws Exception {
		System.out.println("channel Connected......");
		super.channelConnected(ctx, e);
	}

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

 第三步:运行上面的代码,cmd打开dos窗口输入telnet 127.0.0.1 8080 输入内容 程序就可以打印你输入的内容并且可以在dos命令框里打印出你输入的内容。

 

总结:这个列子很简单,可以清楚程序怎么运行的,对理解netty很有帮助

 

 

### Netty 学习笔记与资料 #### 关于Netty的基础概念 Netty个基于NIO(Non-blocking I/O)开发的网络应用框架,它简化了TCP/IP和UDP协议的应用程序开发过程。通过提供异步事件驱动模型以及丰富的API接口,使得开发者可以更专注于业务逻辑而非复杂的I/O操作细节。 #### Direct Buffer特性 Direct Buffer的个显著优点是在使用Socket传输数据时表现出色的性能[^2]。因为这类缓冲区中的数据可以直接被操作系统访问,在某些情况下能够减少不必要的内存复制开销,从而提高效率。 #### 缓冲区内存管理机制 在Netty中,为了高效管理和利用内存资源,引入了两种类型的Buffer:堆内Heap Buffer和直接Direct Buffer。其中,对于后者而言,其创建成本较高但是适合频繁进行I/O操作场景下使用;而对于前者,则更适合般性的应用场景,因为它具有较低的分配销毁代价。 #### 读写指针的工作原理 在个典型的Netty应用程序里,涉及到的数据结构通常会包含对指针——读指针和写指针。当执行写入动作时,写指针向前推进覆盖新的内容;而当发生读取行为时,则由读指针负责定位当前待处理的信息位置。这两者之间的区域代表尚未被消费的消息片段,旦完成解析之后即成为历史记录不再保留价值[^1]。 #### 常见Buffer类型及其用途 根据不同种类的数据需求,Java NIO提供了多种专门化的Buffer实现类来满足特定场合下的存储要求。例如`ByteBuffer`适用于二进制流形式的数据交换;`CharBuffer`则针对字符序列进行了优化设计等等[^3]。 #### 数据写出流程分析 调用`writeAndFlush()`方法意味着启动了轮完整的消息发送周期。此期间不仅包含了实际的数据打包封装工作,更重要的是触发了系列预定义好的处理器链条上的各个节点依次发挥作用直至最终抵达目标端点[^4]。 ```java // 创建并配置ServerBootstrap实例 EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ChannelPipeline p = ch.pipeline(); // 添加自定义处理器... } }); // 绑定监听地址及端口,并同步等待绑定成功 ChannelFuture f = b.bind(PORT).sync(); // 等待服务器套接字关闭 f.channel().closeFuture().sync(); } finally { // 清理资源 bossGroup.shutdownGracefully(); workerGroup.shutdownGracefully(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值