欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

xSocket 通讯框架 demo

发布时间:2024/9/30 43 豆豆
生活随笔 收集整理的这篇文章主要介绍了 xSocket 通讯框架 demo 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

xSocket是一个轻量级的基于nio的服务器框架用于开发高性能、可扩展、多线程的服务器。该框架封装了线程处理、异步读/写等方面。
  http://www.xsocket.org/

API:

http://xsocket.sourceforge.net/core/apidocs/2_1/index.html
http://xsocket.sourceforge.net/core/apidocs/2_1_1/index.html

下载:http://download.csdn.net/source/593929

用xSocket做了个服务端,客户端用开始的flex做的那个聊天室

demo代码

Main.java

  • package chat;
  • import org.xsocket.connection.*;
  • public class Main {
  •     /** Choose your favorite port number. */
  •     private static final int PORT = 8014;
  •     public static void main(String[] args) throws Exception {
  •    // creates the server by passing over the port number & handler
  •     IServer srv = new Server(PORT, new EchoHandler());
  •     //srv.setFlushmode(FlushMode.ASYNC);
  •    // run it within the current thread. 
  •    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); 
  •     }catch(Exception e){
  •         System.out.println(e);
  •     }
  •     //System.out.println("日志: " + srv.getStartUpLogMessage());
  •     }
  • }
  •  

    EchoHandler.java

  • package chat;
  • import org.xsocket.connection.*;
  • import org.xsocket.*; 
  • import java.nio.*;
  • import java.io.*;
  • import java.util.*;
  • class EchoHandler implements IDataHandler,IConnectHandler,IDisconnectHandler  {
  •     public static BManager bMan=new BManager();
  •     public static Map<INonBlockingConnection,String> clientList = new HashMap<INonBlockingConnection,String>();
  •     
  •      public boolean onConnect(INonBlockingConnection nbc) throws IOException {
  •         //... e.g. open resources
  •         System.out.println("onConnect " + nbc.getRemoteAddress()+":"+nbc.getRemotePort());
  •         return true;
  •     }
  •     
  •     public boolean onDisconnect(INonBlockingConnection nbc) throws IOException {
  •         //... e.g. closing open resources
  •         System.out.println("onDisconnect " + nbc.getRemoteAddress()+":"+nbc.getRemotePort());
  •         bMan.remove(nbc);
  •         if(clientList.containsKey(nbc))
  •         {
  •             bMan.sendToAll("22"+clientList.get(nbc)+"离开了...");
  •             clientList.remove(nbc);
  •             funList(clientList);                        
  •         }
  •         bMan.sendClientInfo();        
  •         return true;
  •     }
  •   public boolean onData(INonBlockingConnection connection) 
  •            throws IOException, 
  •            BufferUnderflowException, 
  •            MaxReadSizeExceededException {
  •      // byte[] bytes = connection.readBytesByDelimiter("/n");
  •      // String head = new String(by); 
  •       
  •       String cmd = connection.readStringByDelimiter("/n","utf8");
  •       System.out.println("Get Data " + cmd);
  •       if(cmd.equals("<policy-file-request/>/0"))
  •       {
  •          String xml = "<cross-domain-policy>";
  •          xml = xml + "<site-control permitted-cross-domain-policies=/"all/"/>";
  •          xml = xml + "<allow-access-from domain=/"*/" to-ports=/"8014/" />";
  •          xml = xml + "</cross-domain-policy>";          
  •          connection.write(xml+ "/0");
  •        }  
  •        else {
  •       
  •       String str=cmd.substring(0, 2);//截取第一个字符
  •       int a=Integer.parseInt(str);
  •       String[] arrMsg=cmd.split("--");
  •         switch(a)
  •         {
  •         case 11 :
  •             String strName=cmd.substring(2);
  •             cmd="22"+strName+" login";//""登陆了";
  •             System.out.println(cmd);
  •         //  connection.write(cmd);
  •             bMan.add(connection);
  •             clientList.put(connection,strName);//加入到HashMap中
  •             bMan.sendToAll(cmd);//广播谁登陆了            
  •             funList(clientList);
  •             bMan.sendClientInfo(); 
  •             break;
  •         case 22:            
  •         //  cmd=arrMsg[0]+arrMsg[1]+"说:"+arrMsg[2];
  •             cmd=arrMsg[0]+arrMsg[1]+" say:"+arrMsg[2];
  •         //  connection.write(cmd,"utf8");
  •             bMan.sendToAll(cmd);
  •             System.out.println("公聊"+cmd);
  •             break;
  •         case 33:
  •                             if(arrMsg[1].equals("所有人"))
  •                             {
  •                                 cmd=arrMsg[2]+"说:"+arrMsg[3];
  •                                 bMan.sendToAll("22"+cmd);
  •                             }else
  •                             {
  •                                 INonBlockingConnection socketOne;
  •                                 System.out.println("私聊");
  •                                 Set set = clientList.keySet();//使用keySet方法获取所有key值
  •                                 Iterator it = set.iterator();
  •                                 while (it.hasNext()) {  
  •                                     Object ok=it.next();
  •                                     Object ov=clientList.get(ok);
  •                                     if(ov.equals(arrMsg[1]))//发给对方
  •                                     {
  •                                         socketOne=(INonBlockingConnection)ok;
  •                                         bMan.sendToONE(socketOne,"22(悄悄话)"+arrMsg[2]+"对你说:"+arrMsg[3]);
  •                                     }else if(ov.equals(arrMsg[2]))//发给自己
  •                                     {
  •                                         socketOne=(INonBlockingConnection)ok;
  •                                         bMan.sendToONE(socketOne,"22(悄悄话)你对"+arrMsg[1]+"说:"+arrMsg[3]);
  •                                     }
  •                                 }
  •                             }
  •                             
  •                             break;
  •                     }
  •       }     
  •      return true;   
  • }
  •     void funList(Map clientList) // 广播在线列表
  •     {
  •         String strList="";//在线列表
  •         Set set = clientList.keySet();//使用keySet方法获取所有key值
  •     //  System.out.println(set);
  •         Iterator it = set.iterator();
  •     //  System.out.println(it);
  •         while (it.hasNext()) {//把用户名称发给在线所有客户端  
  •             strList+="--";
  •             strList+=clientList.get(it.next());
  •         }
  •         bMan.sendToAll("11"+strList);
  •     }
  • }
  • 管理客户端类

    BManager.java

  • package chat;
  • import java.io.*;
  • import java.util.*;
  • import org.xsocket.connection.*;
  • class BManager extends Vector
  • {
  •     BManager (){}
  •     void add(INonBlockingConnection sock)
  •     {
  •         super.add(sock);
  •     }
  •     void remove(INonBlockingConnection sock)
  •     {
  •         super.remove(sock);
  •     }
  •     synchronized void sendToAll(String msg)
  •     {
  •     //  PrintWriter writer=null;
  •         INonBlockingConnection sock;
  •         System.out.println("发送"+msg+"/"+size());
  •         for(int i=0;i<size();i++)
  •         {
  •             sock=(INonBlockingConnection)elementAt(i);
  •             try
  •             {
  •              sock.write(msg);   
  •              System.out.println("发送"+sock.getRemoteAddress()+":"+sock.getRemotePort()+"|"+msg);
  •             //  writer=new PrintWriter(sock.getOutputStream(),true);
  •             }catch(Exception ie){}
  •         //  if(writer!=null)writer.println(msg);
  •         }
  •     }
  •     synchronized void sendToONE(INonBlockingConnection socket,String msg)
  •     {
  •     //  PrintWriter writer=null;
  •         INonBlockingConnection sock;
  •         for(int i=0;i<size();i++)
  •         {
  •             sock=(INonBlockingConnection)elementAt(i);
  •             if(socket==sock)
  •             {
  •                 
  •                 try
  •                 {
  •                     sock.write(msg);
  •                 //  writer=new PrintWriter(sock.getOutputStream(),true);
  •                 }catch(Exception ie){}
  •                 //if(writer!=null)writer.println(msg);
  •             }
  •         }
  •         
  •     }
  •     synchronized void sendClientInfo()
  •     {
  •         String info="44当前聊天人数:"+size();
  •         //System.out.println(info);
  •         sendToAll(info);
  •     }
  • }
  • 总结

    以上是生活随笔为你收集整理的xSocket 通讯框架 demo的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。