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

7 篇文章 0 订阅

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

客户端:

//客户端通道和尝试连接的帮助类
			bootstrap = new ClientBootstrap(
					new NioClientSocketChannelFactory(
							Executors.newCachedThreadPool(), 
								Executors.newCachedThreadPool()));
			
			//配置一个子channel pipeline
			bootstrap.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);
			//连接超时时间为3s
			bootstrap.setOption("connectTimeoutMillis", 3000);


LogClientHandler没有什么特别的处理。

服务端:

//接受传入连接的帮助类
		bootstrap = new ServerBootstrap(
				new NioServerSocketChannelFactory(
						Executors.newCachedThreadPool(),
							Executors.newCachedThreadPool()));
		
		//配置一个子channel pipeline
		//每个channel都会拥有自己的ChannelPipeline
		bootstrap.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的属性集
		//设置缓存区大小20M
		bootstrap.setOption("child.receiveBufferSize", 1048576*20);
		bootstrap.setOption("child.keepAlive", false);
		bootstrap.setOption("child.tcpNoDelay", true);
		//创建一个绑定到指定的本地地址的channel
		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));
}

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

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用Spring Boot和Netty来实现对Json字符串的处理。首先,你需要在Spring Boot项目中集成Netty依赖。可以在你的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>4.1.52.Final</version> </dependency> ``` 接下来,你可以创建一个Netty服务器来处理Json字符串。这里是一个简单的示例: ```java import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.handler.codec.LineBasedFrameDecoder; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; public class JsonServer { private int port; public JsonServer(int port) { this.port = port; } public void run() throws Exception { EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap b = new ServerBootstrap(); b.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { @Override public void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast(new LineBasedFrameDecoder(1024)); ch.pipeline().addLast(new StringDecoder()); ch.pipeline().addLast(new StringEncoder()); ch.pipeline().addLast(new JsonHandler()); } }) .option(ChannelOption.SO_BACKLOG, 128) .childOption(ChannelOption.SO_KEEPALIVE, true); System.out.println("Server started on port " + port); b.bind(port).sync().channel().closeFuture().sync(); } finally { workerGroup.shutdownGracefully(); bossGroup.shutdownGracefully(); } } public static void main(String[] args) throws Exception { int port = 8080; new JsonServer(port).run(); } } ``` 在上面的示例中,我们创建了一个简单的Netty服务器,并使用`StringDecoder`和`StringEncoder`来处理字符串的编码和解码。`JsonHandler`是自定义的处理器,你可以在其中实现对Json字符串的处理逻辑。 现在你可以运行这个服务器,并通过发送Json字符串与服务器进行交互。你可以根据自己的需求在`JsonHandler`中添加相应的处理逻辑。 需要注意的是,这只是一个简单的示例,你可能需要根据具体的业务需求进行适当的修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值