?
? ? ? ? 前些时间学习dwr,参考被人,自己做了一个在线一对一的网络聊天程序,程序界面使用Extjs,后台使用了struts2,hibernate3,数据库mysql。
分享下,望评点。
?
?
主要代码:
?
?
package com.webca.actions; import java.util.Collection; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import org.directwebremoting.ScriptSession; import org.directwebremoting.ServerContext; import org.directwebremoting.ServerContextFactory; import org.directwebremoting.WebContextFactory; import org.directwebremoting.proxy.dwr.Util; import com.webca.dao.Message; public class ChatManager { public String updateUsersList(String username, HttpServletRequest request) { WebContextFactory.get().getScriptSession() .setAttribute("username", username); System.out.println("****新用户登录:"+username+" 用户ScriptSession: "+WebContextFactory.get().getScriptSession().getId()); ServletContext sc = request.getSession().getServletContext(); ServerContext sctx = ServerContextFactory.get(sc); // 获得当前浏览 main.jsp 页面的所有脚本session Collection sessions = sctx.getScriptSessionsByPage("/webca/main.jsp"); ScriptSession updateSS=null; Iterator it=sessions.iterator(); for(int i=0;it.hasNext();i++){ updateSS=(ScriptSession) it.next(); System.out.println(i+"、****在线用户:"+updateSS.getAttribute("username")+"用户ScriptSession: "+updateSS.getId()); } Util util = new Util(sessions); util.addFunctionCall("reloadTree"); return ""; } /** * 发送消息 * * @param sender 发送者 * @param receiver 接收者 * @param text 消息内容 * @param request */ public String send(String sender, String receiver, String text, HttpServletRequest request) { if (text != null) { Message msg = new Message(); msg.setDate(new Date()); msg.setSender(sender); msg.setText(text); Collection<ScriptSession> sessions = new HashSet<ScriptSession>(); sessions.addAll(ServerContextFactory.get( request.getSession().getServletContext()) .getScriptSessionsByPage("/webca/main.jsp")); for (ScriptSession session : sessions) { String xusername = (String) session.getAttribute("username"); if (xusername != null && xusername.equals(receiver)) { System.out.println("==>单人聊天: 发送用户: "+xusername+"****ScriptSession: "+session.getId()); Util fromutil = new Util(session); fromutil.addFunctionCall("receiveMessages", msg); } else if (xusername != null && xusername.equals(sender)) { System.out.println("==>单人聊天:接收用户: "+xusername+"****ScriptSession: "+session.getId()); Util toutil = new Util(session); toutil.addFunctionCall("receiveMessages", msg); } } System.out.println("==>单人聊天:"+sender+" 向 "+receiver+" 发送信息: "+text); } return ""; } }
?
本程序可以实现一对一聊天,在同一台电脑上的两个浏览器可以,在局域网的两台电脑也可以,不过有时发送消息会出现问题,不知道是浏览器兼容性的问题,还是代码有些错误,请赐教。。。
界面图片:
?