Java Web 聊天的实现机制是怎么样的

小楼昨夜拂春风 2013-06-07 06:14:46



像新浪秀场那样网页下边 可以加好友 多人聊天
实时接收显示消息 是用什么技术实现的 ajax? 长轮询?
...全文
487 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang7535067 2014-08-10
  • 打赏
  • 举报
回复
引用 7 楼 wen_bihui 的回复:
[quote=引用 2 楼 wang7535067 的回复:] 一种方法是ajax请求方式,这个方式服务器压力比较大。(开发简单)另一种方式是服务器推送技术如Comet4j.这种方式用的比较多。(开发麻烦一点)
您用过comet4j,咋样麻烦了?[/quote] 用过,这个要下载对应的tomcat版本的jar包,然后要后台修改代码
wen_bihui 2014-08-07
  • 打赏
  • 举报
回复
引用 2 楼 wang7535067 的回复:
一种方法是ajax请求方式,这个方式服务器压力比较大。(开发简单)另一种方式是服务器推送技术如Comet4j.这种方式用的比较多。(开发麻烦一点)
您用过comet4j,咋样麻烦了?
xxjxxmxhlr 2013-06-09
  • 打赏
  • 举报
回复
之前看过类似的帖子,你看看这个东西: 网页聊天的基本原理很简单,在使用者发送信息给服务器端时,同时取回新的聊天信息,在使用者沒有发送信息时,同时查询服务端是否有新的信息,並显示在页面中。 不过重点就在于取得信息或重新取得信息的方式,过去,是在让浏览器定时重新刷新网页,每一次除了新的信息之外,往往伴随着大量重复的HTML标记等內容。 如果使用非同步請求,取得XML回应信息,并动态更新页面中显示聊天信息的部分,这么一来,就可以节省掉下载重复页面內容的带宽,使用者的画面也会更稳定,不会因为重新整理而发生闪烁的感觉。 例如,您可以写一个简单的聊天页面: index.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html><head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>聊天室</title> <script type="text/javascript" src="ChatRoomEx-1.js"></script> </head><body> <p>输入信息: <input id="text"/> <input type="button" value="发送" onclick="sendMessage()"/> </p> <p>聊天室信息:</p> <table align="left"> <tbody id="dynamicUpdateArea"></tbody> </table> </body></html> 您可以在这个网页中的文本框中输入文字,而下方会有个显示信息的区域,每次的新信息將只在该区域更新,页面中其余的部分不用变动,所以不用重复下载。 来看一下JavaScript的部分:ChatRoomEx-1.js var xmlHttp; function createXMLHttpRequest() { if (window.ActiveXObject) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }else if (window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); } } function sendMessage() { var msg = document.getElementById("text").value; // 使用者只是随意按下发送按钮,但文本框中沒有文字 if(msg === "") { // 那就重新整理信息区好了 refreshMessage(); return; } // 发送信息 var param = "task=send&msg=" + msg; // ajax请求 ajaxRequest(param); // 清空文本框 document.getElementById("text").value = ""; } // 定时查询用这个 function queryMessage() { var param = "task=query"; ajaxRequest(param); } function ajaxRequest(param) { var url = "ChatRoomServlet?timeStamp=" + new Date().getTime(); createXMLHttpRequest(); xmlHttp.onreadystatechange = refreshMessage; xmlHttp.open("POST", url); xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;"); xmlHttp.send(param); } function refreshMessage() { if(xmlHttp.readyState == 4) { if(xmlHttp.status == 200) { // 处理显示信息的表格区域 var table_body = document.getElementById("dynamicUpdateArea"); var length = table_body.childNodes.length; var i; for (i = 0; i < length; i++) { // 先移除原有的列(row) table_body.removeChild(table_body.childNodes[0]); } // 处理取回的信息 var messages = xmlHttp.responseXML.getElementsByTagName("message"); length = messages.length; for(i = length - 1; i >= 0 ; i--) { var message = messages[i].firstChild.data; // 在表格中新增一列来排列信息 var row = createRow(message); table_body.appendChild(row); } // 下次2秒后会再查询一下有无新信息 setTimeout(queryMessage, 2000); } } } function createRow(message) { var row = document.createElement("tr"); var cell = document.createElement("td"); var cell_data = document.createTextNode(message); cell.appendChild(cell_data); row.appendChild(cell); return row; } 服务器端必须传回以下的XML格式,表示目前服务器端所管理的聊天室中可取得的信息: <messages> <message>聊天信息一</message> <message>聊天信息二</message> <message>聊天信息三</message> </messages> 以下是这个简单的聊天室的Servlet:ChatRoomServlet.java package onlyfun.caterpillar; import java.io.IOException; import java.io.PrintWriter; import java.util.LinkedList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ChatRoomServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { private static LinkedList messages = new LinkedList(); private List addMessage(String text) { if (text != null && text.trim().length() > 0) { messages.addFirst(new Message(text)); while (messages.size() > 10) { messages.removeLast(); } } return messages; } private List getMessages() { return messages; } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List list = null; if("send".equals(request.getParameter("task"))) { String msg = request.getParameter("msg"); // 中文处理 msg = new String(msg.getBytes("ISO-8859-1"), "UTF8"); list = addMessage(msg); } else if("query".equals(request.getParameter("task"))){ list = getMessages(); } response.setContentType("text/xml"); response.setHeader("Cache-Control", "no-cache"); response.setCharacterEncoding("UTF8"); PrintWriter out = response.getWriter(); out.println("< messages>"); for(int i = 0; i < list.size(); i++) { String msg = list.get(i).getText(); out.println("< message>" + msg + "< /message>"); } out.println(" "); out.close(); } } Message.java package onlyfun.caterpillar; public class Message { private String text; public Message(String newtext) { text = newtext; if (text.length() > 256) { text = text.substring(0, 256); } text = text.replace('<', '['); text = text.replace('&', '_'); } public String getText() { return text; } }
yangnianbing110 2013-06-09
  • 打赏
  • 举报
回复
pushlets我最近也在做这个东西
kobe_byrant 2013-06-09
  • 打赏
  • 举报
回复
目测用到flash
猪公公 2013-06-09
  • 打赏
  • 举报
回复
使用长连接!
wang7535067 2013-06-07
  • 打赏
  • 举报
回复
一种方法是ajax请求方式,这个方式服务器压力比较大。(开发简单)另一种方式是服务器推送技术如Comet4j.这种方式用的比较多。(开发麻烦一点)
rumlee 2013-06-07
  • 打赏
  • 举报
回复
ajax 长轮询 你不都说了吗,就是用这些技术啊,不过要考虑性能问题,主要是看你有多大的并发量了。并发量的大小决定了设计的方法。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧