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

  1. package chat;
  2. import org.xsocket.connection.*;
  3. public class Main {
  4.     /** Choose your favorite port number. */
  5.     private static final int PORT = 8014;
  6.     public static void main(String[] args) throws Exception {
  7.    // creates the server by passing over the port number & handler
  8.     IServer srv = new Server(PORT, new EchoHandler());
  9.     //srv.setFlushmode(FlushMode.ASYNC);
  10.    // run it within the current thread. 
  11.    try{
  12.    // srv.run();  // the call will not return
  13.    // ... or start it by using a dedicated thread
  14.     srv.start(); // returns after the server has been started
  15.     System.out.println("服务器" + srv.getLocalAddress() +":"+PORT); 
  16.     }catch(Exception e){
  17.         System.out.println(e);
  18.     }
  19.     //System.out.println("日志: " + srv.getStartUpLogMessage());
  20.     }
  21. }

 

EchoHandler.java

  1. package chat;
  2. import org.xsocket.connection.*;
  3. import org.xsocket.*; 
  4. import java.nio.*;
  5. import java.io.*;
  6. import java.util.*;
  7. class EchoHandler implements IDataHandler,IConnectHandler,IDisconnectHandler  {
  8.     public static BManager bMan=new BManager();
  9.     public static Map<INonBlockingConnection,String> clientList = new HashMap<INonBlockingConnection,String>();
  10.     
  11.      public boolean onConnect(INonBlockingConnection nbc) throws IOException {
  12.         //... e.g. open resources
  13.         System.out.println("onConnect " + nbc.getRemoteAddress()+":"+nbc.getRemotePort());
  14.         return true;
  15.     }
  16.     
  17.     public boolean onDisconnect(INonBlockingConnection nbc) throws IOException {
  18.         //... e.g. closing open resources
  19.         System.out.println("onDisconnect " + nbc.getRemoteAddress()+":"+nbc.getRemotePort());
  20.         bMan.remove(nbc);
  21.         if(clientList.containsKey(nbc))
  22.         {
  23.             bMan.sendToAll("22"+clientList.get(nbc)+"离开了...");
  24.             clientList.remove(nbc);
  25.             funList(clientList);                        
  26.         }
  27.         bMan.sendClientInfo();        
  28.         return true;
  29.     }
  30.   public boolean onData(INonBlockingConnection connection) 
  31.            throws IOException, 
  32.            BufferUnderflowException, 
  33.            MaxReadSizeExceededException {
  34.      // byte[] bytes = connection.readBytesByDelimiter("/n");
  35.      // String head = new String(by); 
  36.       
  37.       String cmd = connection.readStringByDelimiter("/n","utf8");
  38.       System.out.println("Get Data " + cmd);
  39.       if(cmd.equals("<policy-file-request/>/0"))
  40.       {
  41.          String xml = "<cross-domain-policy>";
  42.          xml = xml + "<site-control permitted-cross-domain-policies=/"all/"/>";
  43.          xml = xml + "<allow-access-from domain=/"*/" to-ports=/"8014/" />";
  44.          xml = xml + "</cross-domain-policy>";          
  45.          connection.write(xml+ "/0");
  46.        }  
  47.        else {
  48.       
  49.       String str=cmd.substring(0, 2);//截取第一个字符
  50.       int a=Integer.parseInt(str);
  51.       String[] arrMsg=cmd.split("--");
  52.         switch(a)
  53.         {
  54.         case 11 :
  55.             String strName=cmd.substring(2);
  56.             cmd="22"+strName+" login";//""登陆了";
  57.             System.out.println(cmd);
  58.         //  connection.write(cmd);
  59.             bMan.add(connection);
  60.             clientList.put(connection,strName);//加入到HashMap中
  61.             bMan.sendToAll(cmd);//广播谁登陆了            
  62.             funList(clientList);
  63.             bMan.sendClientInfo(); 
  64.             break;
  65.         case 22:            
  66.         //  cmd=arrMsg[0]+arrMsg[1]+"说:"+arrMsg[2];
  67.             cmd=arrMsg[0]+arrMsg[1]+" say:"+arrMsg[2];
  68.         //  connection.write(cmd,"utf8");
  69.             bMan.sendToAll(cmd);
  70.             System.out.println("公聊"+cmd);
  71.             break;
  72.         case 33:
  73.                             if(arrMsg[1].equals("所有人"))
  74.                             {
  75.                                 cmd=arrMsg[2]+"说:"+arrMsg[3];
  76.                                 bMan.sendToAll("22"+cmd);
  77.                             }else
  78.                             {
  79.                                 INonBlockingConnection socketOne;
  80.                                 System.out.println("私聊");
  81.                                 Set set = clientList.keySet();//使用keySet方法获取所有key值
  82.                                 Iterator it = set.iterator();
  83.                                 while (it.hasNext()) {  
  84.                                     Object ok=it.next();
  85.                                     Object ov=clientList.get(ok);
  86.                                     if(ov.equals(arrMsg[1]))//发给对方
  87.                                     {
  88.                                         socketOne=(INonBlockingConnection)ok;
  89.                                         bMan.sendToONE(socketOne,"22(悄悄话)"+arrMsg[2]+"对你说:"+arrMsg[3]);
  90.                                     }else if(ov.equals(arrMsg[2]))//发给自己
  91.                                     {
  92.                                         socketOne=(INonBlockingConnection)ok;
  93.                                         bMan.sendToONE(socketOne,"22(悄悄话)你对"+arrMsg[1]+"说:"+arrMsg[3]);
  94.                                     }
  95.                                 }
  96.                             }
  97.                             
  98.                             break;
  99.                     }
  100.       }     
  101.      return true;   
  102. }
  103.     void funList(Map clientList) // 广播在线列表
  104.     {
  105.         String strList="";//在线列表
  106.         Set set = clientList.keySet();//使用keySet方法获取所有key值
  107.     //  System.out.println(set);
  108.         Iterator it = set.iterator();
  109.     //  System.out.println(it);
  110.         while (it.hasNext()) {//把用户名称发给在线所有客户端  
  111.             strList+="--";
  112.             strList+=clientList.get(it.next());
  113.         }
  114.         bMan.sendToAll("11"+strList);
  115.     }
  116. }

管理客户端类

BManager.java

  1. package chat;
  2. import java.io.*;
  3. import java.util.*;
  4. import org.xsocket.connection.*;
  5. class BManager extends Vector
  6. {
  7.     BManager (){}
  8.     void add(INonBlockingConnection sock)
  9.     {
  10.         super.add(sock);
  11.     }
  12.     void remove(INonBlockingConnection sock)
  13.     {
  14.         super.remove(sock);
  15.     }
  16.     synchronized void sendToAll(String msg)
  17.     {
  18.     //  PrintWriter writer=null;
  19.         INonBlockingConnection sock;
  20.         System.out.println("发送"+msg+"/"+size());
  21.         for(int i=0;i<size();i++)
  22.         {
  23.             sock=(INonBlockingConnection)elementAt(i);
  24.             try
  25.             {
  26.              sock.write(msg);   
  27.              System.out.println("发送"+sock.getRemoteAddress()+":"+sock.getRemotePort()+"|"+msg);
  28.             //  writer=new PrintWriter(sock.getOutputStream(),true);
  29.             }catch(Exception ie){}
  30.         //  if(writer!=null)writer.println(msg);
  31.         }
  32.     }
  33.     synchronized void sendToONE(INonBlockingConnection socket,String msg)
  34.     {
  35.     //  PrintWriter writer=null;
  36.         INonBlockingConnection sock;
  37.         for(int i=0;i<size();i++)
  38.         {
  39.             sock=(INonBlockingConnection)elementAt(i);
  40.             if(socket==sock)
  41.             {
  42.                 
  43.                 try
  44.                 {
  45.                     sock.write(msg);
  46.                 //  writer=new PrintWriter(sock.getOutputStream(),true);
  47.                 }catch(Exception ie){}
  48.                 //if(writer!=null)writer.println(msg);
  49.             }
  50.         }
  51.         
  52.     }
  53.     synchronized void sendClientInfo()
  54.     {
  55.         String info="44当前聊天人数:"+size();
  56.         //System.out.println(info);
  57.         sendToAll(info);
  58.     }
  59. }
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值