天天看點

XSocket的學習和總結

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代碼  

XSocket的學習和總結
  1. package com.easyway.space.sockets.xsocket;  
  2. import java.io.IOException;  
  3. import java.nio.BufferUnderflowException;  
  4. import java.nio.channels.ClosedChannelException;  
  5. import org.xsocket.MaxReadSizeExceededException;  
  6. import org.xsocket.connection.IConnectHandler;  
  7. import org.xsocket.connection.IConnectionTimeoutHandler;  
  8. import org.xsocket.connection.IDataHandler;  
  9. import org.xsocket.connection.IDisconnectHandler;  
  10. import org.xsocket.connection.IIdleTimeoutHandler;  
  11. import org.xsocket.connection.INonBlockingConnection;  
  12. public class ServerHandler implements IDataHandler ,IConnectHandler ,IIdleTimeoutHandler ,IConnectionTimeoutHandler,IDisconnectHandler {  
  13.     @Override  
  14.     public boolean onConnect(INonBlockingConnection nbc) throws IOException,  
  15.             BufferUnderflowException, MaxReadSizeExceededException {  
  16.         String  remoteName=nbc.getRemoteAddress().getHostName();  
  17.         System.out.println("伺服器資訊 : 用戶端  " + remoteName + " 已經連接配接...");  
  18.             return true;  
  19.     }  
  20.     @Override  
  21.     public boolean onDisconnect(INonBlockingConnection nbc) throws IOException { 
  22. // String remoteName=nbc.getRemoteAddress().getHostName();

    // System.out.println("伺服器資訊:用戶端 "+remoteName+" 已經斷開.");

  23.        return false;  
  24.     }  
  25.     @Override  
  26.     public boolean onData(INonBlockingConnection nbc) throws IOException,  
  27.             BufferUnderflowException, ClosedChannelException,  
  28.             MaxReadSizeExceededException {  
  29.          String data=nbc.readStringByDelimiter("|");  
  30.          nbc.write("--|server:receive data from client sucessful| -----");  
  31.          nbc.flush();  
  32.          System.out.println(data);  
  33.          return true;  
  34.     }  
  35.     @Override  
  36.     public boolean onIdleTimeout(INonBlockingConnection connection) throws IOException {  
  37.         // TODO Auto-generated method stub  
  38.         return false;  
  39.     }  
  40.     @Override  
  41.     public boolean onConnectionTimeout(INonBlockingConnection connection) throws IOException {  
  42.         // TODO Auto-generated method stub  
  43.         return false;  
  44.     }  
  45. }  

服務端類:

Java代碼  

XSocket的學習和總結
  1. package com.easyway.space.sockets.xsocket;  
  2. import java.net.InetAddress;  
  3. import java.util.Map;  
  4. import java.util.Map.Entry;  
  5. import org.xsocket.connection.IServer;  
  6. import org.xsocket.connection.Server;  
  7. import org.xsocket.connection.IConnection.FlushMode;  
  8. public class XSocketServer {  
  9.     private static final int PORT = 8014;  
  10.     public static void main(String[] args) throws Exception {  
  11.         //注意其構造方法有多個。一般是使用這種構造方法出來的!  
  12.         //不過要注意一下java.net.InetAddress這個類的使用在初始化的時候需要捕獲異常  
  13.         //可能是這個綁定的主機可能不存在之類的異常即UnknowHostNameException  
  14.         InetAddress address=InetAddress.getByName("localhost");  
  15.         //建立一個服務端的對象  
  16.         IServer srv = new Server(address,PORT,new ServerHandler());  
  17.         //設定目前的采用的異步模式  
  18.         srv.setFlushmode(FlushMode.ASYNC);  
  19.        try{  
  20.            // srv.run();   
  21.            // the call will not return  
  22.            // ... or start it by using a dedicated thread  
  23.             srv.start(); // returns after the server has been started  
  24.             System.out.println("伺服器" + srv.getLocalAddress() +":"+PORT);   
  25.             Map<String, Class> maps=srv.getOptions();  
  26.             if(maps!=null){  
  27.                 for (Entry<String, Class> entry : maps.entrySet()) {  
  28.                     System.out.println("key= "+entry.getKey()+" value ="+entry.getValue().getName());  
  29.                 }  
  30.             }  
  31.             System.out.println("日志: " + srv.getStartUpLogMessage());  
  32.        }catch(Exception e){  
  33.             System.out.println(e);  
  34.         }  
  35.   }  
  36. }  

用戶端資料處理類:

Java代碼  

XSocket的學習和總結
  1. package com.easyway.space.sockets.xsocket;  
  2. import java.io.IOException;  
  3. import java.nio.BufferUnderflowException;  
  4. import java.nio.channels.ClosedChannelException;  
  5. import org.xsocket.MaxReadSizeExceededException;  
  6. import org.xsocket.connection.IConnectHandler;  
  7. import org.xsocket.connection.IDataHandler;  
  8. import org.xsocket.connection.IDisconnectHandler;  
  9. import org.xsocket.connection.INonBlockingConnection;  
  10. public class ClientHandler implements IDataHandler ,IConnectHandler ,IDisconnectHandler {  
  11.     @Override  
  12.     public boolean onConnect(INonBlockingConnection nbc) throws IOException,  
  13.             BufferUnderflowException, MaxReadSizeExceededException {  
  14.         String  remoteName=nbc.getRemoteAddress().getHostName();  
  15.         System.out.println("remoteName "+remoteName +" has connected !");  
  16.        return true;  
  17.     }  
  18.     @Override  
  19.     public boolean onDisconnect(INonBlockingConnection nbc) throws IOException {  
  20.         // TODO Auto-generated method stub  
  21.        return false;  
  22.     }  
  23.     @Override  
  24.     public boolean onData(INonBlockingConnection nbc) throws IOException,  
  25.             BufferUnderflowException, ClosedChannelException,  
  26.             MaxReadSizeExceededException {  
  27.          String data=nbc.readStringByDelimiter("|");  
  28.          nbc.write("--|Client:receive data from server sucessful| -----");  
  29.          nbc.flush();  
  30.          System.out.println(data);  
  31.          return true;  
  32.     }  
  33. }  

用戶端類:

Java代碼  

XSocket的學習和總結
  1. package com.easyway.space.sockets.xsocket;  
  2. import java.io.IOException;  
  3. import org.xsocket.connection.BlockingConnection;  
  4. import org.xsocket.connection.IBlockingConnection;  
  5. import org.xsocket.connection.INonBlockingConnection;  
  6. import org.xsocket.connection.NonBlockingConnection;  
  7. public class XSocketClient {  
  8.     private static final int PORT = 8014;  
  9.     public static void main(String[] args) throws IOException {  
  10.             //采用非阻塞式的連接配接  
  11.             INonBlockingConnection nbc = new NonBlockingConnection("localhost", PORT, new ClientHandler());  
  12.             //采用阻塞式的連接配接  
  13.             //IBlockingConnection bc = new BlockingConnection("localhost", PORT);  
  14.              //一個非阻塞的連接配接是很容易就變成一個阻塞連接配接  
  15.             IBlockingConnection bc = new BlockingConnection(nbc);  
  16.            //設定編碼格式  
  17.             bc.setEncoding("UTF-8");  
  18.             //設定是否自動清空緩存  
  19.             bc.setAutoflush(true);  
  20.             //向服務端寫資料資訊  
  21.              for (int i = 0; i < 100; i++) {  
  22.                  bc.write(" client | i |love |china !..." +i);  
  23.             }  
  24.              //向用戶端讀取資料的資訊  
  25.            byte[] byteBuffers= bc.readBytesByDelimiter("|", "UTF-8");  
  26.            //列印伺服器端資訊  
  27.            System.out.println(new String(byteBuffers));  
  28.            //将資訊清除緩存,寫入伺服器端  
  29.            bc.flush();  
  30.            bc.close();  
  31.     }  
  32. }  

繼續閱讀