<转>java 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做的那个聊天室

 

ExpandedBlockStart.gif 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); 
    } 
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wind520/archive/2008/09/02/2865039.aspx

转载于:https://www.cnblogs.com/meiqunfeng/archive/2011/03/11/1981632.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值