学习Netty的笔记,笔者是个纯粹的菜鸟,来源于http://blog.csdn.net/kobejayandy/article/details/11493979
这位大佬的博客
看到有人说大佬没有给出依赖的信息
这里笔者补充一下:
<dependency>
<groupId>org.jboss.netty</groupId>
<artifactId>netty</artifactId>
<version>3.2.9.Final</version>
</dependency>
Hollow World的实现
/**
* Netty 服务端代码
*
* @author lihzh
* @alia OneCoder
* @blog http://www.coderli.com
*/
public class HelloServer {
public static void main(String args[]) {
// Server服务启动器
ServerBootstrap bootstrap = new ServerBootstrap( //服务器引导
new NioServerSocketChannelFactory(
//创建异步服务器套接字通道工厂
Executors.newCachedThreadPool(),
//使用Executors创建和管理线程,这里使用newCachedThreadPoll方法创建了一个线程池,对于短期异步线程的程序,提高性能
Executors.newCachedThreadPool()));
// 设置一个处理客户端消息和各种消息事件的类(Handler)
bootstrap
.setPipelineFactory(new ChannelPipelineFactory() {
//设置管道工厂,匿名内部类的方式创建通道管道工厂装入新的管道工厂
@Override
public ChannelPipeline getPipeline()
throws Exception {
return Channels
.pipeline(new HelloServerHandler());
}
});
// 开放8000端口供客户端访问。
bootstrap.bind(new InetSocketAddress(8000));
}
private static class HelloServerHandler extends
SimpleChannelHandler {
/**
* 当有客户端绑定到服务端的时候触发,打印"Hello world, I'm server."
*
* @alia OneCoder
* @author lihzh
*/
@Override
public void channelConnected(
ChannelHandlerContext ctx,
ChannelStateEvent e) {
System.out.println("Hello world, I'm server.");
}
}
}
[java] view plain copy
/**
* Netty 客户端代码
*
* @author lihzh
* @alia OneCoder
* @blog http://www.coderli.com
*/
public class HelloClient {
public static void main(String args[]) {
// Client服务启动器
ClientBootstrap bootstrap = new ClientBootstrap(
new NioClientSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool()));
// 设置一个处理服务端消息和各种消息事件的类(Handler)
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@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, I'm client."
*
* @alia OneCoder
* @author lihzh
*/
@Override
public void channelConnected(ChannelHandlerContext ctx,
ChannelStateEvent e) {
System.out.println("Hello world, I'm client.");
}
}
}
概念理解
Netty是基于事件驱动的,ChennelEvent可以理解为通道事件,在Netty中处理的事件就是channelConnected
ChannelPipeline通道管道
在这里它是控制channelEvent事件分发和传递的。
ChannelHandler通道处理器
Pipeline负责吧事件分发到Netty中的ChannelHandler进行处理,自己的业务逻辑一般都是从这里开始的
Channel 从整体把握形式的
能够告诉你当前通道的状态,是打开还是关闭,获取通道相关的配置信息,的得到pipleline,是一些全局的信息
Channel自然是由ChannelFactory产生的。Channel的实现类型,决定了你这个通道是同步的还是异步的(nio)。例如,我们样例里用的是NioServerSocketChannel。
Object对象的传递实现
Netty的消息传递都是基于流,通过ChannelBuffer传递的,那么自然,Object也需要转换成ChannelBuffer来传递。好在Netty本身已经给我们写好了这样的转换工具。 ObjectEncoder和ObjectDecoder。
工具怎么用?再一次说说所谓的本质,我们之前也说过,Netty给我们处理自己业务的空间是在灵活的可子定义的Handler上的,也就是说,如果我们自己去做这个转换工作,那么也应该在Handler里去做。而Netty,提供给我们的ObjectEncoder和Decoder也恰恰是一组 Handler。
服务端
// 设置一个处理客户端消息和各种消息事件的类(Handler)
bootstrap.setPipelineFactory(newChannelPipelineFactory() {
@Override
publicChannelPipeline getPipeline()throwsException {
returnChannels.pipeline(
newObjectDecoder(ClassResolvers.cacheDisabled(this
.getClass().getClassLoader())),
newObjectServerHandler());
}
});
客户端
// 设置一个处理服务端消息和各种消息事件的类(Handler)
bootstrap.setPipelineFactory(newChannelPipelineFactory() {
@Override
publicChannelPipeline getPipeline()throwsException {
returnChannels.pipeline(newObjectEncoder(),
newObjectClientHandler());
}
});
要传递对象,自然要有一个被传递模型,一个简单的Pojo,当然,实现序列化接口是必须的。
/**
* @author lihzh
* @alia OneCoder
* @bloghttp://www.coderli.com
*/
public class Command implementsSerializable {
privatestaticfinal long serialVersionUID = 7590999461767050471L;
privateString actionName;
publicString getActionName() {
returnactionName;
}
publicvoidsetActionName(String actionName) {
this.actionName = actionName;
}
}
服务端消息发送代码段
private static class ObjectServerHandler extends SimpleChannelHandler{
public void messageReceived(ChannelHandlerContext ctx,MessageEvent e)
throws Exception{
Command command=(Command) e.getMessage();
System.out.println(command.getActionName());
}
}
客户端消息接收代码段
public static class ObjectClientHandler extends SimpleChannelHandler{
public void channelConnected(ChannelHandlerContext ctx,ChannelStateEvent e) {
sendObject(e.getChannel());
}
private void sendObject(Channel channel) {
Command command = new Command();
command.setActionName("链接成功");
channel.write(command);
}
}
netty学习的第一天,看网上的说法,导入jboss的jar包的是netty3版本的,而io的是netty4版本的,但是我没有找到io中代替NioServerSocketChannelFactory的类和这个类,查看了api文档没有找到,希望有知道jboss.netty和io.netty区别的留言讲解