基于XSocket框架的socket编程技巧(同步通信)
最近在做socket通信编程,现总结如下,关于XSocket的大话就不再多说了,google一下一大片。
一、 Server端
Socket监听如下:
ServerHandler handler =
new
ServerHandler();
//创建一个服务端的对象
IServer srv = new Server(address, port, handler);
//设置当前的采用的异步模式
srv.setFlushmode(FlushMode.ASYNC);
//设置连接的超时时间和最大空闲时间
srv.setConnectionTimeoutMillis(5000);
srv.setIdleTimeoutMillis(10000);
//启动监听
srv.start();
|
其中如下两个方法的设置与ServerHandler的实现有关系,
srv.setConnectionTimeoutMillis(5000);
srv.setIdleTimeoutMillis(10000);
下面再看ServerHandler吧
publicclass ServerHandler
implements IDataHandler, IConnectHandler,
IIdleTimeoutHandler, IConnectionTimeoutHandler, IDisconnectHandler
{
publicboolean onConnect(INonBlockingConnection nbc)
throws IOException,
BufferUnderflowException, MaxReadSizeExceededException
{
returntrue;
}
publicboolean onDisconnect(INonBlockingConnection nbc)
throws IOException
{
returntrue;
}
publicboolean onData(INonBlockingConnection nbc)
throws IOException,
BufferUnderflowException, ClosedChannelException,
MaxReadSizeExceededException
{
returntrue;
}
publicboolean onIdleTimeout(INonBlockingConnection connection)
throws IOException
{
System.out.println("onIdleTimeout");
returnfalse;
}
publicboolean onConnectionTimeout(INonBlockingConnection connection)
throws IOException
{
System.out.println("onConnectionTimeout");
returntrue;
}
|
ServerHandler分别实现了以下接口
IDataHandler, IConnectHandler,IIdleTimeoutHandler, IConnectionTimeoutHandler, IDisconnectHandler
其中主要说一下IDataHandler、IIdleTimeoutHandler、IConnectionTimeoutHandler吧。
首先说明一下,socket连接的生命周期与server端的connectionTimeout和idleTimeout及client端有关系。
A、 IDataHandler中的事件onData事件就是处理业务逻辑的,当客户端发送一个业务请求时,会触发此事件。
B、 IIdleTimeoutHandler中的onIdleTimeout事件是在socket连接空闲超时被触发,这个超时时间就是刚刚srv.setIdleTimeoutMillis(10000)设置的值“10000”,单位毫秒。此事件返回一个bool状态,
(1) 如果返回true,xsocket则认为这事件已经关闭了此连接,那么我们在此事件中是否去关闭连接了呢?前面说了这个连接的生命周期和与server端的connectionTimeout和idleTimeout及client端有关,如下解释,
1)、如果close();,那么就不多说了;
2)、如果没有close();,此时又和IConnectionTimeoutHandler的事件onConnectionTimeout和client有关。如果onConnectionTimeout返回false,则此事件被触发并在事件结束后,则xsocket关闭连接;如果onConnectionTimeout返回true,则此连接由client负责关闭。
(2) 如果返回false,相当于onIdleTimeout没有做任何处理,则此时又和IConnectionTimeoutHandler的事件onConnectionTimeout有关。如果onConnectionTimeout事件返回true,则onIdleTimeout事件被触发并在事件结束后由xsocket关闭连接;如果onConnectionTimeout事件返回false,则onConnectionTimeout与onIdleTimeout任何一个事件被触发后就会由xsocket关闭连接。
C、 IConnectionTimeoutHandler中的onConnectionTimeout事件是在socket建立连接后,经过srv.setConnectionTimeoutMillis(5000)这个方法中的值时间后触发此事件,强调是指建立连接时,不是指上一次通信时间。此事件返回一个bool状态:
(1) 如果返回true,如下解释,
与IIdleTimeoutHandler的事件onIdleTimeout和client有关。如果onIdleTimeout返回false,则在onIdleTimeout事件被触发并在事件结束后,则xsocket关闭连接;如果onIdleTimeout返回true,则此连接由client负责关闭。
(2) 如果返回false,解释如下:
与IIdleTimeoutHandler的事件onIdleTimeout有关。如果onIdleTimeout事件返回true,则onConnectionTimeout事件被触发并在事件结束后由xsocket关闭连接;如果onIdleTimeout事件返回false,则onConnectionTimeout与onIdleTimeout任何一个事件被触发后就会由xsocket关闭连接。
终上,关于在服务器端socket连接的生命周期如下表(以下事件中都没有通过编程主动关闭连接):
onIdleTimeout
返回值
|
onConnectionTimeout
返回值
|
何时关闭
|
true
|
true
|
由client端负责
|
false
|
true
|
idleTimeout到时
|
true
|
false
|
connectionTimeout到时
|
false
|
false
|
idleTimeout与connectionTimeout的最小值到达时
|
说明一下connectionTimeout和idleTimeout从何时开始计时:
connectionTimeout是从建立连接开始计时;
idleTimeout是从建立连接或最后一次触发onData事件时开始计时;
二、 Client端
1、如何创建一个同步socket连接?
A、 可以通过直接new 一个BlockingConnection(String hostname,
int port);
B、 也可通过异步连接构建,如new BlockingConnection(INonBlockingConnection delegate)
2、当然XSocket也提供了连接池,同样包括同步连接池和异步连接池。
BlockingConnectionPool pool =
new BlockingConnectionPool();这样就创建了一个同步连接池,既然是池,肯定会有池的大小了,pool.setMaxActivePerServer(poolSize);这是为池设置每个server池的大小,也可以设置池的总大小,如果不设置,默认为值为Integer.MAX_VALUE。
如何从池中获取一个连接呢,如IBlockingConnection bc = pool.getBlockingConnection(host,port);有很多重载方法了。
当获取这个连接之后,我们可以通过设置如下参数进行调整优化:
设置连接超时时间
bc.setConnectionTimeoutMillis(connectTimeoutMillis);
设置连接最大空闲时间
bc.setIdleTimeoutMillis(this.idleTimeoutMillis);
是否自动刷新缓存
bc.setAutoflush(false);
这项时设置在真正要关闭连接时,client端是否要立即释放随机分配的端口,默认不会立即释放端口,需要等待1~4分钟,连接一直处于TIME_WAIT状态,如果这样设置,当关闭连接时,就会立即释放端口。
bc.setOption(IBlockingConnection.SO_LINGER,
"0");
当然当连接使用完以后,需要调用bc.close();放回连接池中,如果close失败,那就要调用pool.destroy(bc)真正的关闭连接了。
仍需要解释下这里的connectTimeoutMillis与idleTimeoutMillis了,
connectTimeoutMillis是池中获取连接开始算起的;
idleTimeoutMillis是在调用close方法后开始算起的;
在client端连接的生命周期为connectTimeoutMillis和idleTimeoutMillis的最小值。
相关推荐
xsocket NIO框架示例 resources 中有相关的 资料。telnet服务测试教程。和相关jar
基于java的开发源码-NIO网络框架 xSocket.zip 基于java的开发源码-NIO网络框架 xSocket.zip 基于java的开发源码-NIO网络框架 xSocket.zip 基于java的开发源码-NIO网络框架 xSocket.zip 基于java的开发源码-NIO网络...
socket,xscoket技术详解,包括两个实例,服务端客户端相互收发信息,建立监听,建立连接等
NIO网络框架 xSocket
基于io包的阻塞式socket通信代码简单,在连接数很少的情况下是一个不错的选择。不过实际应用中一个socket服务器采用传统的阻塞式socket方式通信可能会是一场灾难,一路socket同时进行读写操作可能就需要两条线程,...
基于Java的NIO网络框架 xSocket.zip
基于java的NIO网络框架 xSocket.zip
XSocket的学习和总结 应用服务器网络应用网络协议.net编程 ... 检测问题,如低水平NIO选择编程,连接池管理,连接超时被封装的xSocket。 我从它的官网上面下载了两个JAR一个是其核心JAR包xSocket (core) 下载地址是:
java源码:NIO网络框架 xSocket.rar
socket通讯框架xsocket所需的jar包
基于Java的源码-NIO网络框架 xSocket.zip
基于XSocket、mdb、zq构建端到端高性能可视化量化分析交易系统(包含服务器、客户端,支持ExcelVBAPythonCC++开发).zip
基于Java的实例源码-NIO网络框架 xSocket.zip
基于Java的实例开发源码-NIO网络框架 xSocket.zip
nSocket是基于java NIO.1和NIO.2开发的轻量级网络通信框架,该框架为用户提供异步非阻塞的网络编程接口。目前更新到0.1版本,实现了基本的连通性和简要的通信,在0.2版本中将增加filter chain的功能。nSocket与mina...
xSocket api 2.6.6version
xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。
NIO网络框架 xSocket.7z
xsocket使用指南, xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读写等方面。
一个开源的基于TCP的Socket通信框架,基于java.nio开发的框架。 最好学的一个框架了。 内含开发包、源码和javadoc,javadoc用htmlParser(http://download.csdn.net/detail/liu149339750/4672852)从网站上抓下来的...