您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > xsocket使用指南【官方文档翻译】
核心功能支持面向流通信主要抽象是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赋给它//createstheserverbypassingovertheportnumber&handlerIServersrv=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通过内部的读缓冲区缓冲接收到的网络数据来隐藏网络行为。在没有足够数据可用的情况下,数据分片会导致NonBlockingConnection的read方法抛出BufferUnderflowException异常。根据运行模式,在一个挂起的onData方法调用期间没有数据会在网络层被收到。通过使用NONTHREADED模式,xSocket的内部网络I/O线程执行onDataMethod所以不能读取网络层数据。BufferUnderflowException异常不处理是一个惯用的方法,xSocket会在onData方法返回时处理这个异常。classEchoHandlerimplementsIDataHandler{//thismethodwillbecalledeachtimewhendatafragmentshavebeenreceivedpublicbooleanonData(INonBlockingConnectionnbc)throwsIOException,ClosedChannelException,BufferUnderflowException,MaxReadSizeExceededException{//don'thandletheBufferUnderflowException,xSocketwillswallowitbyte[]bytes=nbc.readBytesByLength(500);//...returntrue;}}因为没有读到的数据在xSocket的内部缓冲内,onData方法会被再次调用。也就是说,onData方法会在没有新的网络数据包到达时调用,因为xSocket的内部读缓冲区是不空的。这个循环会在内部缓冲区为空或者onData方法读不到数据时结束。xSocket在每次调用onData方法后检查内部读缓冲区是否被修改(新的网络数据到达,或者数据被读出),从而决定是不是要再次调用onData。当连接关闭时,onData方法也会被调用。与处理缓冲区的underflow异常一样,closedChannelException也是不处理的,实现IDisconnectHandler来检测连接关闭。3、写阻塞客户端在客户端,使用IBlockingConnection可以简化套接字处理。与NonBlockingconnection不同的是,BlockingConnection不支持回调处理。IBlockingConnectionbc=newBlockingConnection(host,port);Stringreq=Helloserver;bc.write(req+\r\n);//readthewholelogicalpartbywaiting(blocking)until//therequireddatahavebeenreceivedStringres=bc.readStringByDelimiter(\r\n);assert(req.equals(res));4、写非阻塞客户端执行阻塞客户端的读方法,调用会在数据接收到或者超时事件发生后返回。为了避免这种情况,客户端需要定义处理Handler,当网络事件发生后被调用。(IDataHandler,IDisconnectHandler)//definingtheclienthandler(hereasaanonymousinnerclass)IDataHandlerclientHandler=newIDataHandler(){publicbooleanonData(INonBlockingConnectionnbc)throwsIOException,BufferUnderflowException,MaxReadSizeExceededException{//readthewholelogicalpartorthrowingaBufferUnderflowExceptionStringres=nbc.readStringByDelimiter(\r\n);//...returntrue;}};//openingtheconnectionINonBlockingConnectionnbc=newNonBlockingConnection(host,port,clientHandler);nbc.write(Hello);//dosomethingelse.Receivingdatacausesthattheclient//handler'sonDatamethodwillbecalled(withinadedicatedthread)//...5、使用blockingConnection包装non-blockingConnectionxSocket在内部使用INonblockingConnection实现IBlockingConnection.。也就是说,BlockingConnection是带有阻塞行为的read方法的包装,于是NonblockingConnection可以随时变成BlockingConnection。INonBlockingConnectionnbc=...//wrappinganexistingnon-blockingconnectionbyaBlockingConnectionIBlockingConnectionbc=newBlockingConnection(nbc);bc.readInt();//...6、在服务端包装非阻塞Connection在多数情况下,NonblockingConnection在服务端使用,如果服务器端需要一个BlockingConnection,可以通过包装NonBlockingConnection的方式创建。包装非阻塞Connection会导致赋给其的Handler在内部被移除。典型的是onConnect方法会在服务端创建一个BlockingConnection。...classConnectHandlerimplementsIConnectHandler{publicbooleanonConnect(INonBlockingConnectionnbc)throwsIOException{IBlockingConnectionbc=newBlockingConnection(nbc);//returntrue;}...7、处理连接通过实现IConnectHandler接口,onConnect回调用法会被调用。如果一个新连接简历,这个方法会被调用且仅被调用一次。一般而言,这个方法会被用来对新连接进行安全检查,修改连接属性,准备资源,设置回联或者发送欢迎信息。在这个方法读取数据是不推荐的,因为数据不一定准备好。classHandlerimplementsIDataHandler,IConnectHandler{publicbooleanonConnect(INonBlockingConnectionnbc)throwsIOException{//...e.g.openresourcesreturntrue;}publicbooleanonData(INonBlockingConnectionnbc)throwsIOException{//...returntrue;}}8、处理连接断开如果Handler实现了IDisconnectHandler接口,onDisconnect会在连接终止的时候调用(不管是当前进程终止连接或者远程终止),尽管连接通过onDisconnect方法被当作参数传递,但是任何读写操作都是不可以进行,因为连接已经不存在。三种关闭的情况:A、客户端主动关闭。这种情况下onDisconnect被直接调用B、连接损坏或者不恰当的关闭,并且被java虚拟机检测到损坏连接。这种情况下,onDisconnect会在检测到损坏连接时调用。C、连接损坏或者不恰当关闭,但是没有被java虚拟机检测到。这
本文标题:xsocket使用指南【官方文档翻译】
链接地址:https://www.777doc.com/doc-2857571 .html