nio之netty3的应用
1、netty3是nio的封装版本。在使用上面比nio的直接使用更好。nio简单使用都是单线程的方式(比如:一个服务员服务很多客户),但是netty3的方式不一样的是,引入线程池的方式来实现服务的通信(比如:不同的服务员服务不同的客户群体一样)。netty3将入口和实现分成两个线程池。入口:boss,实现:work。实现过程就是当一个客户端进入过后,boss线程池分配一个线程来接待客户,而通过boss来分配具体的服务人work来服务这位客户。
2、netty3的使用是在nio的基础上加入线程池的概念进行实现的,后面我会单独讲一个netty3的源码实现过程。
3、这里写了一点netty3的实现过程。
1)服务端:server和serverHandler
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.codec.string.StringDecoder;
import org.jboss.netty.handler.codec.string.StringEncoder; import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Server { public static void main(String[] args) { //声明服务类
ServerBootstrap serverBootstrap = new ServerBootstrap(); //设定线程池
ExecutorService boss = Executors.newCachedThreadPool();
ExecutorService work = Executors.newCachedThreadPool(); //设置工厂
serverBootstrap.setFactory(new NioServerSocketChannelFactory(boss,work)); //设置管道流
serverBootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline channelPipeline = Channels.pipeline();
//添加处理方式
channelPipeline.addLast("decode",new StringDecoder());
channelPipeline.addLast("encode",new StringEncoder());
channelPipeline.addLast("server",new ServerHandler());
return channelPipeline;
}
}); //设置端口
serverBootstrap.bind(new InetSocketAddress(9000));
}
}
备注:具体的数据处理交给ServerHandler
import org.jboss.netty.channel.*;
public class ServerHandler extends SimpleChannelHandler {
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
System.out.println("client:"+e.getMessage());
ctx.getChannel().write(e.getMessage());
super.messageReceived(ctx, e);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
super.exceptionCaught(ctx, e);
}
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
super.channelConnected(ctx, e);
}
@Override
public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
super.channelDisconnected(ctx, e);
}
@Override
public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
super.channelClosed(ctx, e);
}
}
2)客户端:client和clientHandler
import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.channel.*;
import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
import org.jboss.netty.handler.codec.string.StringDecoder;
import org.jboss.netty.handler.codec.string.StringEncoder; import java.net.InetSocketAddress;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Client { public static void main(String[] args) { //声明客户端
ClientBootstrap clientBootstrap = new ClientBootstrap(); //设置线程池
ExecutorService boss = Executors.newCachedThreadPool();
ExecutorService work = Executors.newCachedThreadPool(); //设置线程池工厂
clientBootstrap.setFactory(new NioClientSocketChannelFactory(boss,work)); //设置管道工厂
clientBootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline channelPipeline = Channels.pipeline();
channelPipeline.addLast("decode",new StringDecoder());
channelPipeline.addLast("encode",new StringEncoder());
channelPipeline.addLast("client",new ClientHandler());
return channelPipeline;
}
}); //连接服务器
ChannelFuture channelFuture = clientBootstrap.connect(new InetSocketAddress("localhost", 9000));
//获取通道
Channel channel = channelFuture.getChannel();
//写入数据
Scanner scanner = new Scanner(System.in);
while (true) {
channel.write(scanner.next());
}
}
}
备注:处理的方式基本上和服务端一样
import org.jboss.netty.channel.*;
public class ClientHandler extends SimpleChannelHandler {
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
System.out.println("server:"+e.getMessage());
super.messageReceived(ctx, e);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
super.exceptionCaught(ctx, e);
}
@Override
public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
super.channelConnected(ctx, e);
}
@Override
public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
super.channelDisconnected(ctx, e);
}
@Override
public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
super.channelClosed(ctx, e);
}
}
4、这里讲的是netty3的应用过程,应用线程池来实现具体的工作。这样在效率和时间上面都会得到很大的改善
nio之netty3的应用的更多相关文章
- Netty5 + WebSocket 练习
1. 了解WebSocket知识 略2. websocket实现系统简单反馈时间 WebSocketServerHandler.java package com.jieli.nettytest.web ...
- Netty3 源代码分析 - NIO server绑定过程分析
Netty3 源代码分析 - NIO server绑定过程分析 一个框架封装的越好,越利于我们高速的coding.可是却掩盖了非常多的细节和原理.可是源代码可以揭示一切. 服务器端代码在指定 ...
- 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...
- 【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战
前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...
- 【原创】NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示
前言 NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能.这其中最流行的无非就是MINA和Netty了,MINA目前的主要版本是MINA2.而Netty的主要版本是Netty3和Netty ...
- 【原创】NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示
申明:本文由作者基于日常实践整理,希望对初次接触MINA.Netty的人有所启发.如需与作者交流,见文签名,互相学习. 学习交流 更多学习资料:点此进入 推荐 移动端即时通讯交流: 215891622 ...
- 几种Java NIO框架的比较(zz)
问题:生活中工作中,会有人问我javaNIO框架里面 Netty Mina xSocket Grizzly 等等哪个比较好? 在这里写一下自己的感受,也算是总结一下吧 在我的印象中.不管是什么NIO ...
- NIO设置SO_LINGER引发的异常
欢迎关注Github:https://github.com/teaey/ ### 背景 银时跟我讲,想从 Netty3迁移到Netty4 . 问其原因是由于 Netty3在容器里会报错,错误堆栈: j ...
- 7.3 netty3基本使用
由于dubbo默认使用的是netty3进行通信的,这里简单的列出一个netty3通信的例子. 一 server端 1 Server package com.hulk.netty.server; imp ...
随机推荐
- js实现抛物线运动 兼容IE低版本(转)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- The Binder Architecture
The Binder Architecture is a declarative architecture for iOS development inspired by MVVM and VIPER ...
- poj 3253 Fence Repair (STL优先队列)
版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/34805369 转载请注明出 ...
- 21、整合Druid数据源
1).引入外部的数据源(Druid) <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependenc ...
- BootstrapTable返回结果集递增序号
{ 'field': '', 'title': '序号', 'align': 'center', 'width': '5%', 'formatter': function (value, row, i ...
- C#处理List<object>重复数据的问题
private class ListDistinct : IEqualityComparer<object> { public bool Equals(object x, object y ...
- 【luogu P2195 HXY造公园】 题解
题目链接:https://www.luogu.org/problemnew/show/P2195 fir.吐槽题目(省略1w字 sec.考虑对一个森林的维护,每棵树用并查集维护. 操作1:输出当前查询 ...
- 我想写一个前端开发工具(三):优化!从vue-cli学了几招
我从过年开始写自己的前端工具 coodev,目前已经写出一个基本的架子,大多数预想的功能都能跑通,还剩一些需要解决的问题也都已经列出来了.本来这一周打算解决对不同后端模板的前后端渲染支持的问题.但是看 ...
- STM32的备份寄存器和控制状态寄存器
STM32的备份寄存器和控制状态寄存器 1 备份寄存器用于RTC时钟 RTC时钟可以在掉电以后继续计数,保证时间的延续,但是重新上电以后需要配置,保证之前的计数不会被清除,可以借助备份寄存器实现,备份 ...
- sql修改数据库中表的结构
ALTER TABLE TableName1 ADD | ALTER [COLUMN] FieldName1 FieldType [(nFieldWidth [, nPrecision])] [NUL ...