【初学与研发之NETTY】netty3之传送字符串以及超长字符串的问题
来源:互联网 发布:dota2最帅英雄知乎 编辑:程序博客网 时间:2024/06/10 06:02
使用netty主要用于建立客户端、服务端,在两者发送字符串(字节)、文件或者对象等,来满足在应用中的需求,这里先说下字符串的传送。个人认为,netty的传送什么都不重要,重要的是采用什么样的转码、解码方式。本人在做日志分析组件的过程中开始将日志信息以字符串的形式通过客户端传送给服务端,主要的代码片段如下:
客户端:
//客户端通道和尝试连接的帮助类bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));//配置一个子channel pipelinebootstrap.setPipelineFactory(new ChannelPipelineFactory() {public ChannelPipeline getPipeline() {ChannelPipeline pipeline = Channels.pipeline();pipeline.addLast("decoder", new StringDecoder());pipeline.addLast("encoder", new StringEncoder());pipeline.addLast("handler", new LogClientHandler());return pipeline;}});// 配置channel的选项集bootstrap.setOption("tcpNoDelay", true);bootstrap.setOption("keepAlive", false);//连接超时时间为3sbootstrap.setOption("connectTimeoutMillis", 3000);
LogClientHandler没有什么特别的处理。
服务端:
//接受传入连接的帮助类bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool()));//配置一个子channel pipeline//每个channel都会拥有自己的ChannelPipelinebootstrap.setPipelineFactory(new ChannelPipelineFactory() {public ChannelPipeline getPipeline() {ChannelPipeline pipeline = Channels.pipeline();pipeline.addLast("decoder", new StringDecoder());pipeline.addLast("encoder", new StringEncoder());//处理业务逻辑的帮组类pipeline.addLast("handler", new LogServerHandler());return pipeline;}});//配置通道// 子channel的属性集//设置缓存区大小20Mbootstrap.setOption("child.receiveBufferSize", 1048576*20);bootstrap.setOption("child.keepAlive", false);bootstrap.setOption("child.tcpNoDelay", true);//创建一个绑定到指定的本地地址的channelbootstrap.bind(configInet(host, port));
LogServerHandler中messageReceived(ChannelHandlerContext ctx, MessageEvent e)直接接受客户端发送的字符串。
netty中在传送字符串的长度有限制,貌似超过1024个字节就截断了,导致接收的信息部完整,经查阅后可采用传送字节数组的方式来解决这个问题:
1、首先在客户端、服务端将转码、解码的方式修改成如下:
pipeline.addLast("decoder", new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,0,4,0,4));
pipeline.addLast("encoder", new LengthFieldPrepender(4, false));
2、客户端传送字符串时需要这样:
ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
buffer.writeBytes(log.getBytes(ConstantSet.CHAR_DECODER));
//当与远程端建立连接以后即刻发送日志信息
channel.write(buffer);
buffer.clear();
3、服务端接收字符串:
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
throws Exception {
//添加到日志队列中
ChannelBuffer buffer = (ChannelBuffer)e.getMessage();
String log = buffer.toString(Charset.forName(ConstantSet.CHAR_DECODER));
}
注:上述的字符串与字节数组转换时,采用的字符集编码请保持一致。
- 【初学与研发之NETTY】netty3之传送字符串以及超长字符串的问题
- 【初学与研发之NETTY】netty3之文件下载
- 【初学与研发之NETTY】netty3之文件上传
- 【初学与研发之NETTY】简介与HelloWorld之例(netty3)
- 【初学与研发之NETTY】netty4之文件下载
- 【初学与研发之NETTY】netty4之文件上传
- 【初学与研发之NETTY】netty4之对象、字节传输
- PHP初学之字符串
- python初学之字符串
- 解决超长字符串分页问题
- PHP初学之字符串函数
- java初学之String字符串
- 初学PHP 之常量,字符串
- 超长字符串
- 超长字符串
- 解决AndroidStudio的logcat显示超长字符串的问题
- 使用javascript解决字符串超长显示的问题
- 字符串匹配的KMP算法之初学整合
- Jiangnan Tiejun we
- 【黑马程序员】Java输入/输出
- also gave birth to a
- ZOJ Basically Speaking
- 职场分享:职场中不要等着老板来给你安排工作
- 【初学与研发之NETTY】netty3之传送字符串以及超长字符串的问题
- PHP后方DB负载--权重算法
- log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析
- perl的变量与括号
- 华为2014 按比特位进行拷贝
- gvim
- Python面试题
- PostMessage,SendMessage跨不同权限进程通信失效的解决办法
- 什么是堆和栈,它们在哪儿?