生活随笔
收集整理的这篇文章主要介绍了
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 { private static final int PORT = 8014; public static void main(String[] args) throws Exception { IServer srv = new Server(PORT, new EchoHandler()); try{ srv.start(); System.out.println("服务器" + srv.getLocalAddress() +":"+PORT); }catch(Exception e){ System.out.println(e); } }}
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 { System.out.println("onConnect " + nbc.getRemoteAddress()+":"+nbc.getRemotePort()); return true; } public boolean onDisconnect(INonBlockingConnection nbc) throws IOException { 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 { 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); bMan.add(connection); clientList.put(connection,strName); bMan.sendToAll(cmd); funList(clientList); bMan.sendClientInfo(); break; case 22: cmd=arrMsg[0]+arrMsg[1]+" say:"+arrMsg[2]; 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(); 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(); Iterator it = set.iterator(); 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) { 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); }catch(Exception ie){} } } synchronized void sendToONE(INonBlockingConnection socket,String msg) { INonBlockingConnection sock; for(int i=0;i<size();i++) { sock=(INonBlockingConnection)elementAt(i); if(socket==sock) { try { sock.write(msg); }catch(Exception ie){} } } } synchronized void sendClientInfo() { String info="44当前聊天人数:"+size(); sendToAll(info); }}
总结
以上是生活随笔为你收集整理的xSocket 通讯框架 demo的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。