xSocket是一个易于使用的基于NIO库来构建高性能,可扩展的网络应用。 它支持写入以及服务器端的应用,以直观的方式客户端应用程序。 检测问题,如低水平NIO选择编程,连接池管理,连接超时被封装的xSocket。
随着xSocket你可以编写高性能,可扩展的客户端和服务器组件的自定义协议如SMTP服务器,代理服务器或客户端和服务器组件是一个基于。
IDataHandler :服务端或者客户端端数据处理类;
IConnectHandler 服务端或者客户端连接成功是处理操作。
IIdleTimeoutHandler 请求处理超时才操作。
IConnectionTimeoutHandler连接超时的操作
IDisconnectHandler 连接断开时的操作
IBlockingConnection 阻塞模式的连接
INonblockingConnection 非阻塞模式的连接
XSocket的ongoing实例:
服务端数据处理类:
package com.easyway.space.sockets.xsocket; import java.io.IOException; import java.nio.BufferUnderflowException; import java.nio.channels.ClosedChannelException; import org.xsocket.MaxReadSizeExceededException; import org.xsocket.connection.IConnectHandler; import org.xsocket.connection.IConnectionTimeoutHandler; import org.xsocket.connection.IDataHandler; import org.xsocket.connection.IDisconnectHandler; import org.xsocket.connection.IIdleTimeoutHandler; import org.xsocket.connection.INonBlockingConnection; /** * 服务端定义数据的处理类 * @author longgangbai * */ public class ServerHandler implements IDataHandler ,IConnectHandler ,IIdleTimeoutHandler ,IConnectionTimeoutHandler,IDisconnectHandler { /** * 即当建立完连接之后可以进行的一些相关操作处理。包括修改连接属性、准备资源、等! * 连接的成功时的操作 */ @Override public boolean onConnect(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, MaxReadSizeExceededException { String remoteName=nbc.getRemoteAddress().getHostName(); System.out.println("remoteName "+remoteName +" has connected !"); return true; } /** * 即如果失去连接应当如何处理? *需要实现 IDisconnectHandler 这个接口 * 连接断开时的操作 */ @Override public boolean onDisconnect(INonBlockingConnection nbc) throws IOException { return false; } /** * 即这个方法不光是说当接收到一个新的网络包的时候会调用而且如果有新的缓存存在的时候也会被调用。而且 *The onData will also be called, if the connection is closed当连接被关闭的时候也会被调用的! */ @Override public boolean onData(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, ClosedChannelException, MaxReadSizeExceededException { String data=nbc.readStringByDelimiter("|"); nbc.write("--|server:receive data from client sucessful| -----"); nbc.flush(); System.out.println(data); return true; } /** * 请求处理超时的处理事件 */ @Override public boolean onIdleTimeout(INonBlockingConnection connection) throws IOException { // TODO Auto-generated method stub return false; } /** * 连接超时处理事件 */ @Override public boolean onConnectionTimeout(INonBlockingConnection connection) throws IOException { // TODO Auto-generated method stub return false; } }
服务端类:
package com.easyway.space.sockets.xsocket; import java.net.InetAddress; import java.util.Map; import java.util.Map.Entry; import org.xsocket.connection.IServer; import org.xsocket.connection.Server; import org.xsocket.connection.IConnection.FlushMode; /** * 采用XSocket通讯的服务端 * @author longgangbai * */ public class XSocketServer { /**设置当前的端口*/ private static final int PORT = 8014; public static void main(String[] args) throws Exception { //注意其构造方法有多个。一般是使用这种构造方法出来的! //不过要注意一下java.net.InetAddress这个类的使用在初始化的时候需要捕获异常 //可能是这个绑定的主机可能不存在之类的异常即UnknowHostNameException InetAddress address=InetAddress.getByName("localhost"); //创建一个服务端的对象 IServer srv = new Server(address,PORT,new ServerHandler()); //设置当前的采用的异步模式 srv.setFlushmode(FlushMode.ASYNC); try{ // srv.run(); // the call will not return // ... or start it by using a dedicated thread srv.start(); // returns after the server has been started 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(Exception e){ System.out.println(e); } } }
客户端数据处理类:
package com.easyway.space.sockets.xsocket; import java.io.IOException; import java.nio.BufferUnderflowException; import java.nio.channels.ClosedChannelException; import org.xsocket.MaxReadSizeExceededException; import org.xsocket.connection.IConnectHandler; import org.xsocket.connection.IDataHandler; import org.xsocket.connection.IDisconnectHandler; import org.xsocket.connection.INonBlockingConnection; /** * 客户端定义数据的处理类 * @author longgangbai * */ public class ClientHandler implements IDataHandler ,IConnectHandler ,IDisconnectHandler { /** * 连接的成功时的操作 */ @Override public boolean onConnect(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, MaxReadSizeExceededException { String remoteName=nbc.getRemoteAddress().getHostName(); System.out.println("remoteName "+remoteName +" has connected !"); return true; } /** * 连接断开时的操作 */ @Override public boolean onDisconnect(INonBlockingConnection nbc) throws IOException { // TODO Auto-generated method stub return false; } /** * * 接收到数据库时候的处理 */ @Override public boolean onData(INonBlockingConnection nbc) throws IOException, BufferUnderflowException, ClosedChannelException, MaxReadSizeExceededException { String data=nbc.readStringByDelimiter("|"); nbc.write("--|Client:receive data from server sucessful| -----"); nbc.flush(); System.out.println(data); return true; } }
客户端类:
package com.easyway.space.sockets.xsocket; import java.io.IOException; import org.xsocket.connection.BlockingConnection; import org.xsocket.connection.IBlockingConnection; import org.xsocket.connection.INonBlockingConnection; import org.xsocket.connection.NonBlockingConnection; /** * 客户端接收服务端信息 * @author longgangbai * IBlockingConnection:这个的话就是不支持事件回调处理机制的! *INonBlockingConnection:这个连接支持回调机制 * *非阻塞的客户端是能够支持事件处理的方法的。即如果从网络通道中没有取到想要的数据就会自动退出程序 */ public class XSocketClient { private static final int PORT = 8014; public static void main(String[] args) throws IOException { //采用非阻塞式的连接 INonBlockingConnection nbc = new NonBlockingConnection("localhost", PORT, new ClientHandler()); //采用阻塞式的连接 //IBlockingConnection bc = new BlockingConnection("localhost", PORT); //一个非阻塞的连接是很容易就变成一个阻塞连接 IBlockingConnection bc = new BlockingConnection(nbc); //设置编码格式 bc.setEncoding("UTF-8"); //设置是否自动清空缓存 bc.setAutoflush(true); //向服务端写数据信息 for (int i = 0; i < 100; i++) { bc.write(" client | i |love |china !..." +i); } //向客户端读取数据的信息 byte[] byteBuffers= bc.readBytesByDelimiter("|", "UTF-8"); //打印服务器端信息 System.out.println(new String(byteBuffers)); //将信息清除缓存,写入服务器端 bc.flush(); bc.close(); } }
代码如上,如有问题,欢迎商讨, 谢谢!