`

IoHandler的实现

 
阅读更多

IoHandler是对数据的最终处理,它会得到数据的信息和状态,尽管处理是在IoHandler里面,但是真正执行通讯的是IoSession,它如同一个载体。 

 

private IoHandler handler = new IoHandler() {
	
		/**
		 * session create
		 */
		public void sessionCreated(IoSession session) throws Exception {
			SocketAddress socketAddress = session.getRemoteAddress();
			String address = socketAddress2Str(socketAddress);
			// 2.如果地址是127.0.0.1,则转换为真实IP地址
			String ip = address.substring(0, address.indexOf(":"));
			String port = address.substring(address.indexOf(":") + 1);
			if (ip.equals("127.0.0.1")) {
				String localAddress = getLocalAddress();
				address = localAddress.substring(0, localAddress.indexOf(":")) + ":" + port;
			}
			// 保存到session attribute
			session.setAttribute(ADDRESS, address);
			// 保存session
			sessionMap.put(address, session);
			sessionCreateTime.put(session, System.currentTimeMillis());
		}
	
		/**
		 * session opened
		 */
		public void sessionOpened(IoSession session) throws Exception {
			// do nothing
		}
	
		/**
		 * session closed
		 */
		public void sessionClosed(IoSession session) throws Exception {
			// 移除session
			String address = (String) session.getAttribute(ADDRESS);
			if (address != null) {
				sessionMap.remove(address);
				sessionCreateTime.remove(session);
				if (logger.isDebugEnabled()) {
					logger.debug("当前连接的连接数为:" + sessionMap.size());
				}
			}
		}
	
		/**
		 * session idle
		 */
		public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
			// 空隙时间大于设置的自动断开时间,断开连接
			long idleTime = System.currentTimeMillis() - session.getLastReadTime();
			if (idleTime > autoDisconnectTimeout) {
				session.close(false);
				return;
			}
		}
	
		/**
		 * exception caught
		 */
		public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
			// 获取远端地址
			String address = (String) session.getAttribute(ADDRESS);
			// 关闭session
			session.close(false);
			// 通知异常监听器
			Exception exception = new Exception("连接异常[" + address + "]", cause);
			// 调用异常listener
			exceptionListener.onException(address, exception);
		}
	
		/**
		 * message received
		 */
		public void messageReceived(IoSession session, Object message) throws Exception {
			byte[] msg = (byte[]) message;
			// 回应心跳消息
			if (msg.length == 1 && msg[0] == HEART_REQUEST_MARK) {
				session.write(new byte[] { HEART_RESPONSE_MARK });
				return;
			}
			// 获取session保存的地址
			String address = (String) session.getAttribute(ADDRESS);
			// 调用accept listener
			acceptListener.handleMessage(address, msg);
		}
	
		/**
		 * message sent
		 */
		public void messageSent(IoSession session, Object message) throws Exception {
			// do nothing
		}
	
	};
 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    深入理解Apache Mina (3)---- 与IoHandler相关的几个类

    NULL 博文链接:https://chinaestone.iteye.com/blog/424576

    Delphi通过https接口post数据

    最初的的时候采用indy控件,IdHTTP和IdSSLIOHandlerSocketOpenSSL配合,但是没有成功,对方服务器连接后立即断开链接,不返回任何数据,后来通过网上查询,找到了这个方法,可以根据服务器的要求自定义头文件和post...

    轻量级网络通信框架nSocket.zip

    nSocket是基于java NIO.1和NIO.2开发的轻量级网络通信框架,该框架为用户提供异步非阻塞的网络编程接口。... 3、IoHandler 4、A Simple Polling 中文详情可见:nSocket设计概要 标签:nSocket

    delphi调用百度API实现图片文字识别

    用Delphi2010编码实现。在开发中遇到了几个问题,现写出来供需要的朋友参考。 1. SSL问题,用的是indyhttp控件,使用SSL时需要添加 IdSSLIOHandlerSocketOpenSSL1 组件 然后 idhttp的iohandler 属性指向 ...

    Mina通讯,长连接,Jar包,以及中文文档

    Android端开发所需jar包和中文api文档, 需要的小伙伴下载下来,给楼主一点分数吧!

    indy10 ssl 发送邮件 dll

    IOHandler = IdSSLIOHandlerSocketOpenSSL1 Host = 'smtp.qq.com' Port = 465 UseTLS = utUseImplicitTLS end object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL Destination = 'smtp.qq....

    jsonrpc:Rust JSON-RPC实现

    JSON-RPC 2.0规范的Rust实现。 与http , ipc , websockets和tcp无关的传输和core服务器。 新的! 为支持。 子项目 jsonrpc-stdio-server jsonrpc派生 jsonrpc-server-utils jsonrpc-pubsub 例子 核 派生 ...

    easysip:基于sip协议的android通话客户端,协议栈jain-sip 媒体库使用webrtc

    easysip基于sip协议的android通话客户端,协议栈jain-sip 媒体库使用webrtc

    IdHTTP应用实例

    使用Indy的IdHTTP控件模拟网站的Get和POST操作

    深入理解Apache_Mina

    Java Nio ByteBuffer与Mina ByteBuffer的区别 Mina的几个类 与IoFilter相关的几个类 与IoHandler相关的几个类 IoFilter和IoHandler的区别和联系 配置Mina的线程模型

    关于apache Mina Server

    深入理解Apache_Mina_(3)----_与IoHandler相关的几个类 深入理解Apache_Mina_(4)----_IoFilter和IoHandler的区别和联系 深入理解Apache_Mina_(5)----_配置Mina的线程模型 深入理解Apache_Mina_(6)----_Java_Nio_...

    Delphi7自带Indy访问Https所需要用到的openssl对应版本,含libeay32.dll和ssleay32.dll

    ... 使用方法: 1.libeay32.dll和ssleay32.dll拷到exe所在目录下即可。 2.IdSSLIOHandlerSocket1属性面板设置SSLOption的Method为...IdHttp1.IOHandler:= IdSSLIOHandlerSocket1; memo1.text:= IdHttp1.get(furl);

    HaruRPC:基于java aio 的RPC 远程调用框架

    IOHandler 从Channel中读取数据并交由Serializer处理的类,本身是异步读取数据 在读取数据时 提供读取完成回调 RPCClient 发送RPC请求的客户端 将调用目标的接口名,方法名,参数列表发送给服务器端。 设计上是线程...

    xe的TIdTCPClient中文乱码问题

    TIdTCPClient中文乱码问题 我在进行indy10.5.7这个...在发的时候这样写IdTCPClient.IOHandler.WriteLn(HTTPEncode(edtMsg.Text)); 在收的时候这样写HTTPDecode(IdTCPClient.IOHandler.ReadLn); 就可以用汉字进行通讯了

    Mina2.0完全剖析,完全自学手册【完整版】.doc

    mina学习资料 引言 1 一. Mina入门 2 第一步.下载使用的Jar包 2 第二步.工程创建配置 2 第三步.服务端程序 3 第四步.客户端程序 6 第五步.长连接VS短连接 8 ...3.IoHandler接口 50 三. Mina实例 50 四. 其他 50

    Apache_Mina2.0学习笔记

    最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 引言 1 一. Mina入门 2 第一步....第二步....第三步....第四步....第五步....二....3.IoHandler接口 50 三. Mina实例 50 四. 其他 50

    delphi xe idftp上传出现乱码解决方案

    代码很简单,代码很简单。 建议到家先行百度 下面是d7的 idFTP1.IOHandler.DefStringEncoding:=tencoding.UTF8;

    indy 10.x 中使用 tcpclient 发送消息,之后马上接收

    indy 10 idtcpclient , indy 10.x 的tcpclient 使用IdTCPClient.IOHandler.Write 发送,代码 中解决了,如何 使用 IdTCPClient 发送之后,接收回消息包。

    delphi7使用Indy10_5515调用https api

    设置idhtp1.IOHandler属性为idslhndlrscktpnsl1 将openssl-1.0.1j-i386-win32.zip解压出来的libeay32.dll和ssleay32.dll放到exe所在路径 function httpAPIPost(url,param:string):string; var ResponseStream,...

    Apache-Mina教程.pdf

    mina框架介绍、主要接口介绍:IoService、IoAcceptor、IoConnector、IoSession、IoSessionConfig、IoHandler、IoBuffer、IoFuture等;信息分段处理demo、多路分离编解码demo、与Spring/JMX集成示例

Global site tag (gtag.js) - Google Analytics