nio之netty5应用
1、netty5和netty4的区别不是很大,但是与netty3差别还是有的。这里不介绍netty4,因为和netty5的方式都差不多。netty5的复杂性相对于netty3要多很多了。基本上架构都被重构了。所以这里主要是介绍一些属性和用法。
2、核心的变化主要有:
- 移动设备变成更加强大
- 通过Ice Cream Sandwich解决了在ADK中最著名的与NIO和SSLEngine相关的问题,且
- 用户显然想要重用他们应用中的的编解码和处理器代码。
EmbeddedChannel ch = ...; // BEFORE:
FullHttpRequest req = (FullHttpRequest) ch.readInbound(); // AFTER:
FullHttpRequest req = ch.readInbound();
3、这里写了一个简单的实现过程,来区分netty5和netty3的写法
1)服务类和处理类
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder; public class Server { public static void main(String[] args) {
//服务类
ServerBootstrap serverBootstrap = new ServerBootstrap();
//声明两个线程池
EventLoopGroup boss = new NioEventLoopGroup();
EventLoopGroup work = new NioEventLoopGroup(); try {
//设置线程组
serverBootstrap.group(boss,work);
//设置服务socket工厂
serverBootstrap.channel(NioServerSocketChannel.class);
//设置管道
serverBootstrap.childHandler(new ChannelInitializer<Channel>() {
protected void initChannel(Channel channel) throws Exception {
channel.pipeline().addLast(new StringDecoder());
channel.pipeline().addLast(new StringEncoder());
channel.pipeline().addLast(new ServerHandler());
}
});
//设置服务器连接数
serverBootstrap.option(ChannelOption.SO_BACKLOG,2048);
//设置tcp延迟状态
serverBootstrap.option(ChannelOption.TCP_NODELAY,true);
//设置激活状态,2小时清除
serverBootstrap.option(ChannelOption.SO_KEEPALIVE,true);
//监听端口
ChannelFuture channelFuture = serverBootstrap.bind(9000);
//等待服务器关闭
channelFuture.channel().closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭线程池
boss.shutdownGracefully();
work.shutdownGracefully();
} } }
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler; public class ServerHandler extends SimpleChannelInboundHandler<String> { //接收消息并处理
protected void messageReceived(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
System.out.println(s);
channelHandlerContext.writeAndFlush("hello client");
}
}
2)客户端和处理类
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder; import java.net.InetSocketAddress;
import java.util.Scanner; //单个客户端
public class Client { public static void main(String[] args) { //服务类
Bootstrap bootstrap = new Bootstrap();
//线程池
EventLoopGroup client = new NioEventLoopGroup(); try {
//设置线程组
bootstrap.group(client);
//设置socket工厂
bootstrap.channel(NioSocketChannel.class);
//设置管道处理
bootstrap.handler(new ChannelInitializer<Channel>() {
protected void initChannel(Channel channel) throws Exception {
channel.pipeline().addLast(new StringEncoder());
channel.pipeline().addLast(new StringDecoder());
channel.pipeline().addLast(new ClientHandler());
}
});
//连接服务器
ChannelFuture channelFuture = bootstrap.connect(new InetSocketAddress("localhost", 9000));
//输入信息测试
Scanner scanner = new Scanner(System.in);
while (true) {
String msg = scanner.nextLine();
channelFuture.channel().writeAndFlush(msg);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭线程池
client.shutdownGracefully();
}
}
}
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler; public class ClientHandler extends SimpleChannelInboundHandler<String>{ //接收消息
protected void messageReceived(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
System.out.println(s);
}
}
3)多个客户端
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder; import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicInteger; //多个客户端连接
public class MClient { //服务类
private Bootstrap bootstrap = new Bootstrap();
//因为线程组里面是线程安全的,所以这里采用数组的形式
private List<Channel> channels = new ArrayList<Channel>();
//原子类,用于计数
private AtomicInteger atomicInteger = new AtomicInteger();
//初始化操作
public void init(int count) {
//声明线程池
EventLoopGroup client = new NioEventLoopGroup();
//设置线程组
bootstrap.group(client);
//设置socket工厂
bootstrap.channel(NioSocketChannel.class);
//设置管道
bootstrap.handler(new ChannelInitializer<Channel>() {
protected void initChannel(Channel channel) throws Exception {
channel.pipeline().addLast(new StringEncoder());
channel.pipeline().addLast(new StringDecoder());
channel.pipeline().addLast(new ClientHandler());
}
});
//初始化连接
for (int i = 0; i < count; i++) {
ChannelFuture channelFuture = bootstrap.connect("10.0.20.154", 9000);
channels.add(channelFuture.channel());
}
} //获取下一个channel
public Channel nextChannel() {
return this.getChannel(0);
} private Channel getChannel(int n) {
//平均获取其中的channel
Channel channel = channels.get(Math.abs(atomicInteger.getAndIncrement() % channels.size()));
//判断是否连接
if (!channel.isActive()) {
//如果没有连接,选择激活替换
channels.set(channels.indexOf(channel), bootstrap.connect("10.0.20.154", 9000).channel());
//超出总长度,直接抛异常
if (n>=channels.size()) {
throw new RuntimeException("no use channel");
}
//递归,目的是获取下一个,直到数组没有channel
return getChannel(n+1);
}
return channel;
} public static void main(String[] args) {
MClient mClient = new MClient();
mClient.init(5);
Scanner scanner = new Scanner(System.in);
while (true) {
try {
String msg = scanner.nextLine();
mClient.nextChannel().writeAndFlush(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
nio之netty5应用的更多相关文章
- Netty、NIO、多线程
一:Netty.NIO.多线程? 时隔很久终于又更新了!之前一直迟迟未动也是因为积累不够,后面比较难下手.过年期间@李林锋hw发布了一个Netty5.0架构剖析和源码解读,看完也是收获不少.前面的文章 ...
- 【转】Netty那点事(四)Netty与Reactor模式
[原文]https://github.com/code4craft/netty-learning/blob/master/posts/ch4-reactor.md 一:Netty.NIO.多线程? 时 ...
- android netty5.0 编译时 java.lang.NoClassDefFoundError: io.netty.channel.nio.NioEventLoopGroup
android netty5.0 编译时 java.lang.NoClassDefFoundError: io.netty.channel.nio.NioEventLoopGroup 复制netty包 ...
- Netty5序章之BIO NIO AIO演变
Netty5序章之BIO NIO AIO演变 Netty是一个提供异步事件驱动的网络应用框架,用以快速开发高性能.高可靠的网络服务器和客户端程序.Netty简化了网络程序的开发,是很多框架和公司都在使 ...
- 【原创】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 ...
- Netty5 + WebSocket 练习
1. 了解WebSocket知识 略2. websocket实现系统简单反馈时间 WebSocketServerHandler.java package com.jieli.nettytest.web ...
随机推荐
- codeforces793 B. Igor and his way to work (dfs)
题目链接:codeforces793 B. Igor and his way to work (dfs) 求从起点到终点转方向不超过两次是否有解,,好水啊,感觉自己代码好搓.. #include< ...
- Cocos2dx打包apk时变更NDK引发问题及解决
现在官方的Cocos Studio已经支持打包apk文件,写该随笔的时候还没试过官方的打包功能,所以就按自己的学习顺序先把打包的心得写下. 问题及最终解决方案: 其中耗时最长的问题就是ndk-r10改 ...
- [转]C#打造一个开源webgis(一)系统架构
搭建一个GIS系统,为了能同时适应C/S和B/S架构,建议是做成自己的地图服务api方式,这样,一个或多个系统,就能通过统一的地图服务接口提供,而通信可以采用http的resful方式,而一个webG ...
- 【AngularJS学习笔记】Java Script "use strict" 严格模式
---恢复内容开始--- 学习Angular的时候,发现好多优秀的源码中,JS文件的最上面,都会写上"use strict"; 这几个字符,搜了一下,找到一篇比较不错的文章,抄过来 ...
- 过滤器Filter在配置文件中不起作用
web.xml内容 <filter> <filter-name>LoginFilter</filter-name> <filter-class>com. ...
- python爬取斗鱼B总直播弹幕
在某群中看到关于弹幕爬取的需求,又因为斗鱼比较OP,就以这个作为切入点. 如果你想了解如何获取弹幕,我的这个例子就可以让你豁然开朗,对于哪些没有开发弹幕的直播或视频平台,就需要用抓包工具获取请求,然后 ...
- Oracle中转义下划线
原意是查询出所有的月粒度模型,但是在oracle中,下划线也代表匹配单一任何字符,导致15分钟粒度的模型也被查询出来,在此,需要对下划线做转义,使其只表示下划线的含义,可以使用ESCAPE()函数. ...
- C++笔记005:用面向过程和面向对象方法求解圆形面积
原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 结束了第一个hello world程序后,我们来用面向过程和面向对象两个方法来求解圆的面积这个问题,以能够更清晰的体会面向对象和面向过程. ...
- React组件的使用
一.index.js 文件[基本配置] //react语法塘 import React from 'react'; //reactDom用来操作虚拟DOM import ReactDom from ...
- phpstudy lamp
phpStudy for Linux (lnmp+lamp一键安装包 现在不考虑安装这个 (完整版:http://lamp.phpstudy.net/phpstudy-all.bin) 安装: wg ...