文档章节

【初学与研发之NETTY】netty3之传送字符串以及超长字符串的问题

Zero零_度
 Zero零_度
发布于 2017/06/02 18:01
字数 591
阅读 31
收藏 0

使用netty主要用于建立客户端、服务端,在两者发送字符串(字节)、文件或者对象等,来满足在应用中的需求,这里先说下字符串的传送。个人认为,netty的传送什么都不重要,重要的是采用什么样的转码、解码方式。本人在做日志分析组件的过程中开始将日志信息以字符串的形式通过客户端传送给服务端,主要的代码片段如下:

客户端:

[java] view plain copy

 print?

  1. //客户端通道和尝试连接的帮助类  
  2.             bootstrap = new ClientBootstrap(  
  3.                     new NioClientSocketChannelFactory(  
  4.                             Executors.newCachedThreadPool(),   
  5.                                 Executors.newCachedThreadPool()));  
  6.               
  7.             //配置一个子channel pipeline  
  8.             bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  9.                 public ChannelPipeline getPipeline() {  
  10.                     ChannelPipeline pipeline = Channels.pipeline();  
  11.                     pipeline.addLast("decoder", new StringDecoder());  
  12.                     pipeline.addLast("encoder", new StringEncoder());  
  13.                     pipeline.addLast("handler", new LogClientHandler());  
  14.                     return pipeline;  
  15.                 }  
  16.             });  
  17.             // 配置channel的选项集  
  18.             bootstrap.setOption("tcpNoDelay", true);  
  19.             bootstrap.setOption("keepAlive", false);  
  20.             //连接超时时间为3s  
  21.             bootstrap.setOption("connectTimeoutMillis", 3000);  


LogClientHandler没有什么特别的处理。

服务端:

[java] view plain copy

 print?

  1. //接受传入连接的帮助类  
  2.         bootstrap = new ServerBootstrap(  
  3.                 new NioServerSocketChannelFactory(  
  4.                         Executors.newCachedThreadPool(),  
  5.                             Executors.newCachedThreadPool()));  
  6.           
  7.         //配置一个子channel pipeline  
  8.         //每个channel都会拥有自己的ChannelPipeline  
  9.         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  10.             public ChannelPipeline getPipeline()  {  
  11.                 ChannelPipeline pipeline = Channels.pipeline();  
  12.                 pipeline.addLast("decoder", new StringDecoder());  
  13.                 pipeline.addLast("encoder", new StringEncoder());  
  14.                 //处理业务逻辑的帮组类  
  15.                 pipeline.addLast("handler", new LogServerHandler());  
  16.                 return pipeline;  
  17.             }  
  18.         });  
  19.         //配置通道  
  20.         // 子channel的属性集  
  21.         //设置缓存区大小20M  
  22.         bootstrap.setOption("child.receiveBufferSize", 1048576*20);  
  23.         bootstrap.setOption("child.keepAlive", false);  
  24.         bootstrap.setOption("child.tcpNoDelay", true);  
  25.         //创建一个绑定到指定的本地地址的channel  
  26.         bootstrap.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));
}

注:上述的字符串与字节数组转换时,采用的字符集编码请保持一致。

本文转载自:http://blog.csdn.net/mcpang/article/details/38613857

Zero零_度
粉丝 69
博文 1258
码字总数 257684
作品 0
程序员
私信 提问
dubbo通信消息解析过程分析(1)

由于rpc底层涉及网络编程接口,线程模型,网络数据结构,服务协议,细到字节的处理。牵涉内容较多,今天就先从一个点说起。 说说,dubbo通过netty框架做传输层,从接到数据字节流到把字节转换...

wannshan
2018/01/19
5
0
NETTY如何实现短连接

现在用NETTY3写一个和联通SGIP协议短信网关通信的程序,现在用的长连接,服务器总是一段时间后断开连接,请问怎么保持连接

lushan
2010/11/16
9.8K
9
[Java] Netty Websocket Server Javascript Client

WebSocket协议的出现无疑是 HTML5 中最令人兴奋的功能特性之一,它能够很好地替代Comet技术以及Flash的XmlSocket来实现基于HTTP协议的双向通信。目前主流的浏览器,如Chrome、Firefox、IE10、...

长平狐
2012/11/19
774
1
netty 程序内存泄露问题

本人用NETTY3开发的短信网关程序,连接网关正常,接收发信息也正常 但程序运行一段时间后,CPU占用和内存占用缓慢递增,运行三天后程序就要报OUT OF MEREROY了 不知是什么原因,会否是NETTY...

lushan
2010/11/26
1K
2
为什么dubbo2.5.6-2.5.10 用的是netty 4 而dubbo2.6.x有用netty3了?

为什么dubbo2.5.6-2.5.10 用的是netty 4 而dubbo2.6.x有用netty3了?

赵松强
2018/04/17
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

以太坊私有链搭建

https://blog.csdn.net/Blockchain_lemon/article/details/80589123

Moks角木
31分钟前
1
0
自律给我自信-为什么要自律

为什么要自律 混一天和努力一天 看不到任何差别 3天看不到任何变化 7天也看不到任何效果 但是 1个月后, 会看到话题不同 3个月后, 会看到气场不同 6个月后, 会看到距离不同 3年后, 会看到...

周大壮
31分钟前
1
0
读书replay计划说明

突然脑袋一闪,我有了这样一个主意:通过写博客的方式,将我阅读的书中的内容replay出来。 我一般会找着我感兴趣的书去读,一般也会读书中我感兴趣的章节,或者当下对我有用的章节,所以这个...

wanxiangming
33分钟前
0
0
CentOS7安装xrdp环境可实现远程桌面访问

CentOS7安装xrdp环境可实现远程桌面访问 2018-07-14 06:39:28 分类:运维 阅读(2051) 评论(0) 在"Ubuntu系统安装xrdp桌面客户端及实现远程连接桌面"文章中有分享过在Ubuntu系统中安装XRDP环境...

linjin200
57分钟前
4
0
ConfigurationProperties

package cn.enjoy.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @ConfigurationProperties(pr......

少年已不再年少
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部