一.netty简介:
简介
Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、 高可靠性的网络服务器和客户端程序。例如实现了某种协议的客户,服务端应用。 Netty相当简化和流线化了网络应用的编程开发过程,例如,TCP和UDP的socket服务开发。
解释
nio是什么:
nio 是 java New IO 的简称,在 jdk1.4 里提供的新 api 官方标榜的特性如下:
– 为所有的原始类型提供 (Buffer) 缓存支持。
– 字符集编码解码解决方案。
– Channel :一个新的原始 I/O 抽象。
– 支持锁和内存映射文件的文件访问接口。
– 提供多路 (non-bloking) 非阻塞式的高伸缩性网络 I/O 。
netty的功能
netty是分布式的,分多个服务,Netty中,需要区分Server和Client服务。所有的Client都是绑定在Server上的, 他们之间是不能通过Netty直接通信的。 通信过程是:Server端开放端口,供Client连接,Client发起请求, 我们做的是客户端与服务器连接完成的事情。客户端告诉我连接成功了,我就负责处理,这就是netty框架的作用。
二、新技术之惯例-hello,Word!
1.服务端代码
package com.baidu.netty;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.SimpleChannelHandler;
importorg.jboss.netty.channel.socket.nio.
NioServerSocketChannelFactory;
import org.jboss.netty.bootstrap.ServerBootstrap;
public class HelloServer {
public static void main(String[] args) {
// 创建Server服务器
ServerBootstrap bootstrap = new ServerBootstrap(
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
//设置这个类
bootstrap.setPipelineFactory(
new ChannelPipelineFactory() {
// 处理客户端消息和事件的类(Handler)
@Override
public ChannelPipeline getPipeline() throws Exception {
returnChannels.pipeline(newHelloServerHandler());
}
});
// 开放本机8000端口供客户端访问。
bootstrap.bind(new InetSocketAddress(8000));
}
private static class HelloServerHandler extends SimpleChannelHandler{
//当有客户端绑定到服务端的时候触发,打印:Hello,world!----我是服务器
@Override
public void channelConnected(ChannelHandlerContext ctx,
ChannelStateEvent e) {
System.out.println("Hello,world!----我是服务器");
}
}
}
2.客户端代码
package com.baidu.netty;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.SimpleChannelHandler;
import org.jboss.netty.channel.socket.nio.
NioClientSocketChannelFactory;
public class HelloClient {
public static void main(String args[]) {
// 创建Client服务启动器
ClientBootstrap bootstrap = new ClientBootstrap(
new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
//设置这个类
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
// 处理服务端消息和事件的类(Handler)
@Override
public ChannelPipeline getPipeline() throws Exception {
return Channels.pipeline(new HelloClientHandler());
}
});
// 连接到本地的8000端口的服务端
bootstrap.connect(new InetSocketAddress(
"127.0.0.1", 8000));
}
private static class HelloClientHandler extends SimpleChannelHandler {
// 当绑定到服务端的时候触发,打印:Hello,world! 我是客户端
@Override
public void channelConnected(ChannelHandlerContext ctx,
ChannelStateEvent e) {
System.out.println("Hello,world! 我是客户端");
}
}
}
三、知识点讲解
1.先来说说这个 ChannelEvent,Netty 是基于事件驱动的,就是我们
上文提到的,发生什么事,就通知”有关部门”。
我们处理的事件就是 channelConnected。以后,我们还会处理更多的事件。
2.Pipeline,翻译成中文的意思是:管道,传输途径。也就是说,在这里他是控制 ChannelEvent 事件分发和传递的。
事件在管道中流转,第一站到哪,第二站到哪,到哪是终点,就是用这个 ChannelPipeline 处理的。
事件到了 ChannelHandler 这里,就要被具体的进行处理了,也就是说,你自己的业务逻辑一般都是从这里开始的。
4.有了个部门的协调处理,我们还需要一个从整体把握形势的,所谓―大局观的部门,channel。
是一些全局的信息。Channel 自然是由 ChannelFactory 产生的。Channel 的实现类型,
决定了你这个通道是同步的还是异步的(nio)。例如,我们样例里用的是NioServerSocketChannel 。
这些是基本概念,希望大家相互学习,上面的有些资料摘自其他大神,谢谢大家!