XSocket的学习和总结(一)

2011年04月08日 星期五 下午 02:48

xSocket是一个易于使用的基于NIO库来构建高性能,可扩展的网络应用。 它支持写入以及服务器端的应用,以直观的方式客户端应用程序。 检测问题,如低水平NIO选择编程,连接池管理,连接超时被封装的xSocket。  

我从它的官网上面下载了两个JAR一个是其核心JAR包 xSocket (core) 
下载地址是:http://sourceforge.net/projects/xsocket/files/xsocket%202.x/2.7.2/xSocket-2.7.2.jar/download

另外一个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实例:

服务端数据处理类:

Java代码
  1. package com.easyway.space.sockets.xsocket;   
  2.   
  3.   
  4. import java.io.IOException;   
  5. import java.nio.BufferUnderflowException;   
  6. import java.nio.channels.ClosedChannelException;   
  7.   
  8. import org.xsocket.MaxReadSizeExceededException;   
  9. import org.xsocket.connection.IConnectHandler;   
  10. import org.xsocket.connection.IConnectionTimeoutHandler;   
  11. import org.xsocket.connection.IDataHandler;   
  12. import org.xsocket.connection.IDisconnectHandler;   
  13. import org.xsocket.connection.IIdleTimeoutHandler;   
  14. import org.xsocket.connection.INonBlockingConnection;   
  15. /**  
  16.  * 服务端定义数据的处理类  
  17.  * @author longgangbai  
  18.  *  
  19.  */  
  20. public class ServerHandler implements IDataHandler ,IConnectHandler ,IIdleTimeoutHandler ,IConnectionTimeoutHandler,IDisconnectHandler {   
  21.   
  22.     /**  
  23.      * 即当建立完连接之后可以进行的一些相关操作处理。包括修改连接属性、准备资源、等!  
  24.      * 连接的成功时的操作  
  25.      */  
  26.     @Override  
  27.     public boolean onConnect(INonBlockingConnection nbc) throws IOException,   
  28.             BufferUnderflowException, MaxReadSizeExceededException {   
  29.         String  remoteName=nbc.getRemoteAddress().getHostName();   
  30.         System.out.println("remoteName "+remoteName +" has connected !");   
  31.             return true;   
  32.     }   
  33.     /**  
  34.      * 即如果失去连接应当如何处理?  
  35.      *需要实现 IDisconnectHandler  这个接口  
  36.      * 连接断开时的操作  
  37.      */  
  38.     @Override  
  39.     public boolean onDisconnect(INonBlockingConnection nbc) throws IOException {   
  40.        return false;   
  41.     }   
  42.     /**  
  43.      * 即这个方法不光是说当接收到一个新的网络包的时候会调用而且如果有新的缓存存在的时候也会被调用。而且  
  44.      *The onData will also be called, if the connection is closed当连接被关闭的时候也会被调用的!  
  45.      */  
  46.     @Override  
  47.     public boolean onData(INonBlockingConnection nbc) throws IOException,   
  48.             BufferUnderflowException, ClosedChannelException,   
  49.             MaxReadSizeExceededException {   
  50.          String data=nbc.readStringByDelimiter("|");   
  51.          nbc.write("--|server:receive data from client sucessful| -----");   
  52.          nbc.flush();   
  53.          System.out.println(data);   
  54.          return true;   
  55.     }   
  56.     /**  
  57.      * 请求处理超时的处理事件  
  58.      */  
  59.     @Override  
  60.     public boolean onIdleTimeout(INonBlockingConnection connection) throws IOException {   
  61.         // TODO Auto-generated method stub   
  62.         return false;   
  63.     }   
  64.     /**  
  65.      * 连接超时处理事件  
  66.      */  
  67.     @Override  
  68.     public boolean onConnectionTimeout(INonBlockingConnection connection) throws IOException {   
  69.         // TODO Auto-generated method stub   
  70.         return false;   
  71.     }   
  72.   
  73. }  
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;
 }

}

 

 

服务端类:

Java代码
  1. package com.easyway.space.sockets.xsocket;   
  2.   
  3. import java.net.InetAddress;   
  4. import java.util.Map;   
  5. import java.util.Map.Entry;   
  6.   
  7. import org.xsocket.connection.IServer;   
  8. import org.xsocket.connection.Server;   
  9. import org.xsocket.connection.IConnection.FlushMode;   
  10.   
  11. /**  
  12.  * 采用XSocket通讯的服务端  
  13.  * @author longgangbai  
  14.  *  
  15.  */  
  16. public class XSocketServer {   
  17.        
  18.     /**设置当前的端口*/  
  19.     private static final int PORT = 8014;   
  20.        
  21.     public static void main(String[] args) throws Exception {   
  22.         //注意其构造方法有多个。一般是使用这种构造方法出来的!   
  23.         //不过要注意一下java.net.InetAddress这个类的使用在初始化的时候需要捕获异常   
  24.         //可能是这个绑定的主机可能不存在之类的异常即UnknowHostNameException   
  25.         InetAddress address=InetAddress.getByName("localhost");   
  26.         //创建一个服务端的对象   
  27.         IServer srv = new Server(address,PORT,new ServerHandler());   
  28.         //设置当前的采用的异步模式   
  29.         srv.setFlushmode(FlushMode.ASYNC);   
  30.        try{   
  31.            // srv.run();    
  32.            // the call will not return   
  33.            // ... or start it by using a dedicated thread   
  34.             srv.start(); // returns after the server has been started   
  35.             System.out.println("服务器" + srv.getLocalAddress() +":"+PORT);    
  36.             Map maps=srv.getOptions();   
  37.             if(maps!=null){   
  38.                    
  39.                 for (Entry entry : maps.entrySet()) {   
  40.                     System.out.println("key= "+entry.getKey()+" value ="+entry.getValue().getName());   
  41.                 }   
  42.             }   
  43.             System.out.println("日志: " + srv.getStartUpLogMessage());   
  44.                
  45.        }catch(Exception e){   
  46.             System.out.println(e);   
  47.         }   
  48.           
  49.   }   
  50.   

你可能感兴趣的:(xsocket)