文档章节

Netty5.0 实现心跳包

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:41
字数 491
阅读 80
收藏 1

这是一个netty自带的echo案例,添加了心跳包的设置而已,关键代码如下:


/*
 * Copyright 2012 The Netty Project
 *
 * The Netty Project licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */
package io.netty.example.echo;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
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.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.handler.ssl.SslContext;
import io.netty.handler.ssl.util.SelfSignedCertificate;
import io.netty.handler.timeout.IdleStateHandler;

/**
 * Echoes back any received data from a client.
 */
public final class EchoServer {

	static final boolean SSL = System.getProperty("ssl") != null;
	static final int PORT = Integer
			.parseInt(System.getProperty("port", "8007"));

	public static void main(String[] args) throws Exception {
		// Configure SSL.
		final SslContext sslCtx;
		if (SSL) {
			SelfSignedCertificate ssc = new SelfSignedCertificate();
			sslCtx = SslContext.newServerContext(ssc.certificate(),
					ssc.privateKey());
		} else {
			sslCtx = null;
		}

		// Configure the server.
		EventLoopGroup bossGroup = new NioEventLoopGroup(1);
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		try {
			ServerBootstrap b = new ServerBootstrap();
			b.group(bossGroup, workerGroup)
					.channel(NioServerSocketChannel.class)
					.option(ChannelOption.SO_BACKLOG, 100)
					.handler(new LoggingHandler(LogLevel.INFO))
					.childHandler(new ChannelInitializer<SocketChannel>() {
						@Override
						public void initChannel(SocketChannel ch)
								throws Exception {
							ChannelPipeline p = ch.pipeline();
							if (sslCtx != null) {
								
								p.addLast(sslCtx.newHandler(ch.alloc()));
							}
							// p.addLast(new LoggingHandler(LogLevel.INFO));
							p.addLast("idleStateHandler", new IdleStateHandler(10, 5, 0));
					                p.addLast("myHandler", new MyHandler());
							p.addLast(new EchoServerHandler());
						}
					});

			// Start the server.
			ChannelFuture f = b.bind(PORT).sync();

			// Wait until the server socket is closed.
			f.channel().closeFuture().sync();
		} finally {
			// Shut down all event loops to terminate all threads.
			bossGroup.shutdownGracefully();
			workerGroup.shutdownGracefully();
		}
	}
}

package io.netty.example.echo;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.timeout.IdleState;
import io.netty.handler.timeout.IdleStateEvent;

/**
 * @Project : netty
 * @Package : io.netty.example.echo
 * @Class : MyHandler
 * @Company 广州讯动网络科技有限公司
 * @Author : 蔡文锋
 * @DateTime:2015年4月21日 下午11:15:47
 * @Blog:http://blog.csdn.net/caiwenfeng_for_23
 * @Description : {
 *  Handler should handle the IdleStateEvent triggered by IdleStateHandler.
 * }
 *
 */
public class MyHandler extends ChannelHandlerAdapter {
	@Override
	public void userEventTriggered(ChannelHandlerContext ctx, Object evt)
			throws Exception {
		if (evt instanceof IdleStateEvent) {
			IdleStateEvent e = (IdleStateEvent) evt;
			if (e.state() == IdleState.READER_IDLE) {
				ctx.close();
				System.out.println("READER_IDLE 读超时");
			} else if (e.state() == IdleState.WRITER_IDLE) {
				ByteBuf buff = ctx.alloc().buffer();
				buff.writeBytes("mayi test".getBytes());
				ctx.writeAndFlush(buff);
				System.out.println("WRITER_IDLE 写超时");
			}
		}
	}
}



首先添加了idleStateHandler用于监听链接idle,如果连接到达idle时间,这个handler会触发idleEvent,之后通过重写userEventTriggered方法,完成idle事件的处理。

可以用telnet进行测试:

telnet 127.0.0.1 8007

测试结果:

WRITER_IDLE 写超时
READER_IDLE 读超时

本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/45181927

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
Android 端用netty5.0要使用到哪些 jar包,求解,用all的话太大了

Android 端用netty5.0要使用到哪些 jar包,求解,用all的话太大了

有毛的汉子
2015/03/31
1K
2
Netty实现高性能、高可靠、可定制和可扩展分析

Netty如何实现高性能? 性能是设计出来的,不是测试出来的。Netty采用如下设计实现高性能: 采用异步非阻塞的I/O类库,基于Reactor模式实现,解决了传统同步阻塞I/O模式下一个服务端无法平滑...

宸明
2018/09/08
54
0
web socket 心跳包的实现方案

现在网络环境错综复杂,socket心跳包是获得健康强壮的连接的有效解决方案,今天,我们就在web socket中实现心跳包方案,是的,尽管我们只是做一个简单的聊天室,但我们让他稳定可靠一些一点也...

红薯
2010/06/02
6.6K
5
Netty服务器在线上运行了几天,就会出现大量的TIME_WAIT,之后客户端就怎么都连接不上了,服务端的通道总是拒绝连接

netty5.0 服务端运行一段时间后,产生大量的timeout,客户端总是连接不上 客户端是gprs连接

landlore
2016/09/21
2.3K
7
C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包

原文:C#高性能大容量SOCKET并发(六):超时Socket断开(守护线程)和心跳包 守护线程 在服务端版Socket编程需要处理长时间没有发送数据的Socket,需要在超时多长时间后断开连接,我们需要独...

杰克.陈
2017/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Replugin借助“UI进程”来快速释放Dex

public static boolean preload(PluginInfo pi) { if (pi == null) { return false; } // 借助“UI进程”来快速释放Dex(见PluginFastInstallProviderProxy的说明) return PluginFastInsta......

Gemini-Lin
今天
4
0
Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
今天
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部