netty初试
netty官网:点击进入
学习netty之实现一个丢弃服务器
环境:
- JDK1.8
- netty5.0+
步骤:
- 实现一个丢弃服务器
- 实现一个客户端发送数据
丢弃服务器的创建
//用于接受客户端的的连接,将连接注册到worker中
EventLoopGroup boos = new NioEventLoopGroup(); //处理客户端的连接
EventLoopGroup worker = new NioEventLoopGroup(); //服务端启动类
ServerBootstrap serverBootstrap = new ServerBootstrap(); ChannelFuture sync = null;
try {
ServerBootstrap boot = serverBootstrap.group(boos, worker)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
//自己继承了ChannelHandlerAdapter
ch.pipeline().addLast(new DiscardHandler());
}
});
//绑定端口,接受连接
sync = boot.bind(10980).sync();
System.out.println("丢弃服务器启动...");
//等待服务器关闭
sync.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
if(null != sync){
try {
//管理连接
sync.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//处理完客户端的请求后在优雅的关闭
boos.shutdownGracefully();
worker.shutdownGracefully();
}
DiscardHandler实现:
public class DiscardHandler extends ChannelHandlerAdapter {
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
System.out.println("客户端断开连接");
ctx.writeAndFlush(Unpooled.copiedBuffer("有一个客户端断开连接".getBytes("UTF-8")));
cause.printStackTrace();
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
服务器端本地查看发送来的信息
ByteBuf msg1 = (ByteBuf) msg;
byte[] buf = new byte[msg1.readableBytes()];
msg1.readBytes(buf);
String s = new String(buf, "UTF-8");
System.out.println("客户端发来的信息:"+s);
//直接丢弃信息
ReferenceCountUtil.release(msg);
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.writeAndFlush(Unpooled.copiedBuffer("---连接成功:",CharsetUtil.UTF_8));
}
}
客户端发送数据:
NioEventLoopGroup clientGroup = null;
try {
clientGroup = new NioEventLoopGroup();
Bootstrap bootstrap = new Bootstrap();
ChannelFuture connect = bootstrap.group(clientGroup)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
//自定义客户端的发送逻辑
ch.pipeline().addLast(new ClientHandler());
}
})
.connect("localhost", 10980);
while (true) {
Scanner scanner = new Scanner(System.in);
System.out.println("输入 exit 结束:");
String s = scanner.nextLine(); if (!Objects.isNull(s) && s.equals("exit")) {
connect.channel().writeAndFlush(Unpooled.copiedBuffer(s.getBytes("UTF-8")))
//关闭监听器,代表ChannelFuture执行返回后,关闭连接。
.addListener(ChannelFutureListener.CLOSE);
break;
}
connect.channel().writeAndFlush(Unpooled
.copiedBuffer(s.getBytes("UTF-8")));
}
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
} finally {
clientGroup.shutdownGracefully();
}
}
ClientHandler实现:
public class ClientHandler extends ChannelHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ByteBuf msg1 = (ByteBuf) msg;
byte[] buf = new byte[msg1.readableBytes()];
msg1.readBytes(buf);
System.out.println("服务器返回的信息:"+new String(buf,"UTF-8"));
//释放内存
ReferenceCountUtil.release(msg);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
ctx.close();
System.out.println(cause.getMessage());
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
ctx.writeAndFlush(Unpooled.copiedBuffer("HI 首次连接".getBytes("UTF-8")));
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
System.out.println("数据发送成功");
}
}
问题:
开始是继承了SimpleChannleINBoundAdpater<ByteBuf>
在channelReadComplete中 发送 ctx.writeAndFlush()中发送服务器,会造成死循环,客户端一直发送信息给服务器,造成资源浪费
其次,在发发送数据的时候直接发送ByteBuf对象,客户端是无法接受到的需要转换成
Unpooled.copiedBuffer(byte[]); 发送数据
PS:
可以实现在线用户数量梳理:
在服务端初始化一个AtomicInteger类,每次客户端连接的时候将此数值原子性+1,
在客户端断开的时候将其-1.每个用户连接后,将其信息发送出去。
netty初试的更多相关文章
- 记录初试Netty(2)-服务端心跳检测
今天在在搭建的netty框架中添加心跳机制,特此记录一下: 1.什么是心跳机制? 心跳是在TCP长连接中,客户端和服务端定时向对方发送数据包通知对方自己还在线,保证连接的有效性的一种机制 在 ...
- 谈谈如何使用Netty开发实现高性能的RPC服务器
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...
- 基于netty http协议栈的轻量级流程控制组件的实现
今儿个是冬至,所谓“冬大过年”,公司也应景五点钟就放大伙儿回家吃饺子喝羊肉汤了,而我本着极高的职业素养依然坚持留在公司(实则因为没饺子吃没羊肉汤喝,只能呆公司吃食堂……).趁着这一个多小时的时间,想跟 ...
- 从netty-example分析Netty组件续
上文我们从netty-example的Discard服务器端示例分析了netty的组件,今天我们从另一个简单的示例Echo客户端分析一下上个示例中没有出现的netty组件. 1. 服务端的连接处理,读 ...
- 源码分析netty服务器创建过程vs java nio服务器创建
1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...
- 从netty-example分析Netty组件
分析netty从源码开始 准备工作: 1.下载源代码:https://github.com/netty/netty.git 我下载的版本为4.1 2. eclipse导入maven工程. netty提 ...
- Netty实现高性能RPC服务器优化篇之消息序列化
在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...
- Netty构建分布式消息队列(AvatarMQ)设计指南之架构篇
目前业界流行的分布式消息队列系统(或者可以叫做消息中间件)种类繁多,比如,基于Erlang的RabbitMQ.基于Java的ActiveMQ/Apache Kafka.基于C/C++的ZeroMQ等等 ...
- 基于Netty打造RPC服务器设计经验谈
自从在园子里,发表了两篇如何基于Netty构建RPC服务器的文章:谈谈如何使用Netty开发实现高性能的RPC服务器.Netty实现高性能RPC服务器优化篇之消息序列化 之后,收到了很多同行.园友们热 ...
随机推荐
- python learning 字符串方法
一.重点掌握的6种字符串方法: 1.join命令 功能:用于合并,将字符串中的每一个元素按照指定分隔符进行拼接 程序举例: seq = ['1','2','3','4'] sep = '+' v = ...
- js获取HTML DOM节点元素方法总结
1. 通过顶层document节点获取: (1)document.getElementById(elementId) :通过ID获得节点,如果页面上含有多个相同id的节点,那么只返回第一个节点. ...
- BUAA-OO-第一单元表达式求导作业总结
figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...
- tensorflow(3)可视化,日志,调试
可视化 添加变量 tf.summary.histogram( "weights1", weights1) # 可视化观看变量 还有添加图像和音频. 常量 tf.summary.sc ...
- AMBER: CPPTRAJ Tutorial C0
CPPTRAJ作为PTRAJ的继任者,拥有比PTRAJ更强大的功能,本教程会简要的介绍CPPTRAJ的用法及注意事项. 需要的文件: trpzip2.gb.nc trpzip2.ff10.mbondi ...
- window系统下搭建本地的NuGet Server
1. NuGet.Config文件所在的目录: C:\Users\xxx\AppData\Roaming\NuGet 2.将nupkg为结尾的文件放在 项目的Packages目录下.(注意是和web. ...
- vue页面传参
1.传的参数是数组 传递参数的页面 let setStr = encodeURIComponent(JSON.stringify(this.tableData)); this.$router.push ...
- 1.1大数据平台架构及Hadoop生态圈
1.硬件架构实例 2.软件架构实例 3.数据流通用概念模型 a.数据源(互联网.物联网.企业数据):App.Device.Site b.数据收集(ETL.提取.转换.加载):Flume.Kafka.S ...
- Unity如何退出游戏
使用 Application.Quit(),但在 editor 模式下使用 Application.Quit()是没用的,要用 EditorApplication.isPlaying = false. ...
- URLConnection类详解-转
转-http://www.cnblogs.com/shijiaqi1066/p/3753224.html 1. URLConnection概述 URLConnection是一个抽象类,表示指向URL指 ...