xSocket是一个易于使用的基于NIO库来构建高性能,可扩展的网络应用。它支持写入以及服务器端的应用,以直观的方式客户端应用程序。检测问题,如低水平NIO选择编程,连接池管理,连接超时被封装的xSocket。
我从它的官网上面下载了两个JAR一个是其核心JAR包
xSocket (core)
另外一个JAR包是:xSocket multiplexed
下载地址是http://sourceforge.net/projects/xsocket/files/xsocket%202.x%20-%20multiplexed/2.1.5/xSocket-multiplexed-2.1.5.jar/download(这个JAR包比较小)
先掌握其core部分然后再去学习其扩展部分的功能!
随着xSocket你可以编写高性能,可扩展的客户端和服务器组件的自定义协议如SMTP服务器,代理服务器或客户端和服务器组件是一个基于。
IDataHandler :服务端或者客户端端数据处理类;
IConnectHandler 服务端或者客户端连接成功是处理操作。
IIdleTimeoutHandler 请求处理超时才操作。
IConnectionTimeoutHandler连接超时的操作
IDisconnectHandler 连接断开时的操作
IBlockingConnection阻塞模式的连接
INonblockingConnection 非阻塞模式的连接
XSocket的ongoing实例:
服务端数据处理类:
- packagecom.easyway.space.sockets.xsocket;
- importjava.io.IOException;
- importjava.nio.BufferUnderflowException;
- importjava.nio.channels.ClosedChannelException;
- importorg.xsocket.MaxReadSizeExceededException;
- importorg.xsocket.connection.IConnectHandler;
- importorg.xsocket.connection.IConnectionTimeoutHandler;
- importorg.xsocket.connection.IDataHandler;
- importorg.xsocket.connection.IDisconnectHandler;
- importorg.xsocket.connection.IIdleTimeoutHandler;
- importorg.xsocket.connection.INonBlockingConnection;
- /**
- *服务端定义数据的处理类
- *@authorlonggangbai
- *
- */
- publicclassServerHandlerimplementsIDataHandler,IConnectHandler,IIdleTimeoutHandler,IConnectionTimeoutHandler,IDisconnectHandler{
- /**
- *即当建立完连接之后可以进行的一些相关操作处理。包括修改连接属性、准备资源、等!
- *连接的成功时的操作
- */
- @Override
- publicbooleanonConnect(INonBlockingConnectionnbc)throwsIOException,
- BufferUnderflowException,MaxReadSizeExceededException{
- StringremoteName=nbc.getRemoteAddress().getHostName();
- System.out.println("服务器信息 : 客户端 " + remoteName + " 已经连接...");
- returntrue;
- }
- /**
- *即如果失去连接应当如何处理?
- *需要实现IDisconnectHandler这个接口
- *连接断开时的操作
- */
- @Override
- publicbooleanonDisconnect(INonBlockingConnectionnbc)throwsIOException{
-
// String remoteName=nbc.getRemoteAddress().getHostName();
// System.out.println("服务器信息:客户端 "+remoteName+" 已经断开.");
- returnfalse;
- }
- /**
- *即这个方法不光是说当接收到一个新的网络包的时候会调用而且如果有新的缓存存在的时候也会被调用。而且
- *TheonDatawillalsobecalled,iftheconnectionisclosed当连接被关闭的时候也会被调用的!
- */
- @Override
- publicbooleanonData(INonBlockingConnectionnbc)throwsIOException,
- BufferUnderflowException,ClosedChannelException,
- MaxReadSizeExceededException{
- Stringdata=nbc.readStringByDelimiter("|");
- nbc.write("--|server:receivedatafromclientsucessful|-----");
- nbc.flush();
- System.out.println(data);
- returntrue;
- }
- /**
- *请求处理超时的处理事件
- */
- @Override
- publicbooleanonIdleTimeout(INonBlockingConnectionconnection)throwsIOException{
- //TODOAuto-generatedmethodstub
- returnfalse;
- }
- /**
- *连接超时处理事件
- */
- @Override
- publicbooleanonConnectionTimeout(INonBlockingConnectionconnection)throwsIOException{
- //TODOAuto-generatedmethodstub
- returnfalse;
- }
- }
服务端类:
- packagecom.easyway.space.sockets.xsocket;
- importjava.net.InetAddress;
- importjava.util.Map;
- importjava.util.Map.Entry;
- importorg.xsocket.connection.IServer;
- importorg.xsocket.connection.Server;
- importorg.xsocket.connection.IConnection.FlushMode;
- /**
- *采用XSocket通讯的服务端
- *@authorlonggangbai
- *
- */
- publicclassXSocketServer{
- /**设置当前的端口*/
- privatestaticfinalintPORT=8014;
- publicstaticvoidmain(String[]args)throwsException{
- //注意其构造方法有多个。一般是使用这种构造方法出来的!
- //不过要注意一下java.net.InetAddress这个类的使用在初始化的时候需要捕获异常
- //可能是这个绑定的主机可能不存在之类的异常即UnknowHostNameException
- InetAddressaddress=InetAddress.getByName("localhost");
- //创建一个服务端的对象
- IServersrv=newServer(address,PORT,newServerHandler());
- //设置当前的采用的异步模式
- srv.setFlushmode(FlushMode.ASYNC);
- try{
- //srv.run();
- //thecallwillnotreturn
- //...orstartitbyusingadedicatedthread
- srv.start();//returnsaftertheserverhasbeenstarted
- System.out.println("服务器"+srv.getLocalAddress()+":"+PORT);
- Map<String,Class>maps=srv.getOptions();
- if(maps!=null){
- for(Entry<String,Class>entry:maps.entrySet()){
- System.out.println("key="+entry.getKey()+"value="+entry.getValue().getName());
- }
- }
- System.out.println("日志:"+srv.getStartUpLogMessage());
- }catch(Exceptione){
- System.out.println(e);
- }
- }
- }
客户端数据处理类:
- packagecom.easyway.space.sockets.xsocket;
- importjava.io.IOException;
- importjava.nio.BufferUnderflowException;
- importjava.nio.channels.ClosedChannelException;
- importorg.xsocket.MaxReadSizeExceededException;
- importorg.xsocket.connection.IConnectHandler;
- importorg.xsocket.connection.IDataHandler;
- importorg.xsocket.connection.IDisconnectHandler;
- importorg.xsocket.connection.INonBlockingConnection;
- /**
- *客户端定义数据的处理类
- *@authorlonggangbai
- *
- */
- publicclassClientHandlerimplementsIDataHandler,IConnectHandler,IDisconnectHandler{
- /**
- *连接的成功时的操作
- */
- @Override
- publicbooleanonConnect(INonBlockingConnectionnbc)throwsIOException,
- BufferUnderflowException,MaxReadSizeExceededException{
- StringremoteName=nbc.getRemoteAddress().getHostName();
- System.out.println("remoteName"+remoteName+"hasconnected!");
- returntrue;
- }
- /**
- *连接断开时的操作
- */
- @Override
- publicbooleanonDisconnect(INonBlockingConnectionnbc)throwsIOException{
- //TODOAuto-generatedmethodstub
- returnfalse;
- }
- /**
- *
- *接收到数据库时候的处理
- */
- @Override
- publicbooleanonData(INonBlockingConnectionnbc)throwsIOException,
- BufferUnderflowException,ClosedChannelException,
- MaxReadSizeExceededException{
- Stringdata=nbc.readStringByDelimiter("|");
- nbc.write("--|Client:receivedatafromserversucessful|-----");
- nbc.flush();
- System.out.println(data);
- returntrue;
- }
- }
客户端类:
- packagecom.easyway.space.sockets.xsocket;
- importjava.io.IOException;
- importorg.xsocket.connection.BlockingConnection;
- importorg.xsocket.connection.IBlockingConnection;
- importorg.xsocket.connection.INonBlockingConnection;
- importorg.xsocket.connection.NonBlockingConnection;
- /**
- *客户端接收服务端信息
- *@authorlonggangbai
- *IBlockingConnection:这个的话就是不支持事件回调处理机制的!
- *INonBlockingConnection:这个连接支持回调机制
- *
- *非阻塞的客户端是能够支持事件处理的方法的。即如果从网络通道中没有取到想要的数据就会自动退出程序
- */
- publicclassXSocketClient{
- privatestaticfinalintPORT=8014;
- publicstaticvoidmain(String[]args)throwsIOException{
- //采用非阻塞式的连接
- INonBlockingConnectionnbc=newNonBlockingConnection("localhost",PORT,newClientHandler());
- //采用阻塞式的连接
- //IBlockingConnectionbc=newBlockingConnection("localhost",PORT);
- //一个非阻塞的连接是很容易就变成一个阻塞连接
- IBlockingConnectionbc=newBlockingConnection(nbc);
- //设置编码格式
- bc.setEncoding("UTF-8");
- //设置是否自动清空缓存
- bc.setAutoflush(true);
- //向服务端写数据信息
- for(inti=0;i<100;i++){
- bc.write("client|i|love|china!..."+i);
- }
- //向客户端读取数据的信息
- byte[]byteBuffers=bc.readBytesByDelimiter("|","UTF-8");
- //打印服务器端信息
- System.out.println(newString(byteBuffers));
- //将信息清除缓存,写入服务器端
- bc.flush();
- bc.close();
- }
- }