发布于2021-04-09 07:08 阅读(432) 评论(0) 点赞(3) 收藏(2)
与NIO中的SocketChannel类似,Netty中的Channel也用于处理基本的I/O操作(连接,读写,绑定端口),但在Netty中对Channel进行了重新实现,主要实现类有:NioSocketChannel,NioServerSocketChannel,NioDatagramChannel
等
通过channel类的API,可以获取网络的连接通道状态,配置参数等
EventLoop可通过group()方法获取其所属的EventLoopGroup
任务队列:
ChannelFuture cf = bootstrap.connect("127.0.0.1",6666);
cf.addListener(new ChannelFutureListener(){
@Override
public void operationComplete(ChannelFuture channelFuture) throws Exception{
if(channelFuture.isSuccess){
sout("success!");
}else{
channelFuture.cause().printStackTrace();
}
}
}
ChannelHandler和ChannelPipeline是Netty中最核心的组件,当Channel发生I/O事件需要被处理时,ChannelPipeline可以看作是对该事件进行处理的流水线,而ChannelHandler可以看作是流水线上的一道道工序。当各个工序都完成后,该事件也就被成功处理。
因此,当需要处理各种网络事件时,只需实现Channel的Handler,规定业务处理流程,而无需关心网络编程的细节,从而大大简化开发。
根据数据的流入流出方向,可以将ChannelHandler分为入站Handler和出站Handler:
使用示例:
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
/**
* 读取数据方法
* @param ctx 上下文对象,含有pipeline, channel, 地址
* @param msg 客户端发送的数据
* @throws Exception
*/
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//将msg转为ByteBuf
ByteBuf byteBuf = (ByteBuf) msg;
System.out.println("客户端发送消息:" + byteBuf.toString(CharsetUtil.UTF_8));
}
/**
* 读取事件完毕
*/
@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
//将数据写入到缓冲并刷新,且对数据进行编码
ctx.writeAndFlush(Unpooled.copiedBuffer("hello, client~", CharsetUtil.UTF_8));
}
/**
* 处理异常,一般需要关闭通道
*/
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
ctx.close();
}
}
ChannelHandlerContext可以看作是ChannelPipeline中的上下文信息,其绑定了Pipeline和Channel信息,且负责各ChannelHandler之间的交互
常用方法:
原文链接:https://blog.csdn.net/wanger61/article/details/115487160
作者:大哥你来啦
链接:http://www.qianduanheidong.com/blog/article/58509/c6eb59877e0ad97bf50d/
来源:前端黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 前端黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-3
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!