xsocket使用指南【官方文档翻译】.pdf
核心功能
支持面向流通信主要抽象是Connection接口。通过IBlockingConnection或者
INonblockingConnection对象进行数据的读写。在record或者bulk状态中,
Connection对象提供了对于特定数据类型的几个方便方法。
Connection实现了java.nio包中的GatheringByteChannel和
WritableByteChannel接口,如果InputStream或者OutputStream对象被需要,可
以使用java.nio.Channels.newInputStream(readableChannel)和
java.nio.Channels.newOutputStream(writeableChannel)包装channel对象,因为
经典的流只有在IBlockingConnection映射到经典的InputStream中时才有阻塞行
为。
提供的其他类型方法主要是控制连接行为和获取连接信息的方法。比如,远
程链接点信息可以获取到,连接的数据冲刷行为可以被控制。这些方法都不是线
程安全的。
与IBlockingConnection不同的是,INonBlockingConnection在调用read方法
直接返回。将IDataHandler对象赋给INonBlockingConnection对象可以使其在新
数据到来时被通知。当对应的事件发生时,IDataHandler对象的回调函数会被调
用。除了IDataHandler也存在IConnectionHandler对象。
服务器端在INonblockingConnection接口上处理接入连接。
1、示例:简单TCP服务器
首先定义实现了需要的接口(比如,IDataHandler,IConnectHandler,
IIdleTimeoutHandler或者IConnectionTimeoutHandler),这个DataHandler会在从
连接上接收到数据时被调用。
classEchoHandlerimplementsIDataHandler{
publicbooleanonData(INonBlockingConnectionnbc)
throwsIOException,
BufferUnderflowException,
MaxReadSizeExceededException{
Stringdata=nbc.readStringByDelimiter(\r\n);
nbc.write(data+\r\n);
returntrue;
}
}
然后创建一个服务器实例,并将上面的DataHandler赋给它
//createstheserverbypassingovertheportnumberhandler
IServersrv=newServer(8090,newEchoHandler());
//runitwithinthecurrentthread.
srv.run();//thecallwillnotreturn
//...orstartitbyusingadedicatedthread专用线程
srv.start();//returnsaftertheserverhasbeenstarted
与run方法对应的,服务器的start方法创建一个专用的线程来运行服务器。
start方法在内部阻塞知道服务器启动,为了确保服务器在执行其他进一步操作前
被启动,这是比较好的方法。
执行服务器的close方法来优雅的关闭服务器。就像其他面向连接的框架,
服务器实现了java.io.Closable接口
2、DataHandler的onData方法的语义分析
IDataHandler的onData方法会在数据分片被接收后直接调用。要注意的是,
在网络层,数据可以被分解成若干个TCP片段也可能被组合打包成一个TCP报
文。在客户端执行类似于connection.write(“hello”)的写操作,并不意味着一个TCP
报文到达服务器端。xSocket通过内部的读缓冲区缓冲接收