简单的ajax聊天网页 socket

简单的ajax聊天网页

 

 

下载源代码


〖 作者:良葛格 〗〖 大小:3k 〗〖 发布日期:2007-06-28 〗〖 浏览:2 〗
                                                                                    
    网页聊天的基本原理很简单,在使用者发送信息给服务器端时,同时取回新的聊天信息,在使用者沒有发送信息时,同时查询服务端是否有新的信息,並显示在页面中。

  不过重点就在于取得信息或重新取得信息的方式,过去,是在让浏览器定时重新刷新网页,每一次除了新的信息之外,往往伴随着大量重复的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="发送" οnclick="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; } }

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很抱歉,我之前的回答有误。由于我是一个语言模型AI,无法直接给出具体的代码和部署过程。以下是一份示例代码,供您参考: 1. 前端页面设计 ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>在线聊天室</title> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/socket.io/4.2.0/socket.io.js"></script> <style> #chat-window { height: 400px; overflow-y: scroll; } </style> </head> <body> <h1>在线聊天室</h1> <div id="chat-window"></div> <input type="text" id="message-input"> <button id="send-button">发送</button> <script> var socket = io.connect("http://localhost:3000"); var username = prompt("请输入您的用户名:"); socket.on("connect", function() { console.log("连接成功"); socket.emit("join", username); }); socket.on("message", function(data) { $("#chat-window").append("<p>" + data.username + ":" + data.message + "</p>"); }); $("#send-button").click(function() { var message = $("#message-input").val(); socket.emit("message", message); $("#message-input").val(""); }); </script> </body> </html> ``` 2. 后端处理 ```java import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketClose; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketConnect; import org.eclipse.jetty.websocket.api.annotations.OnWebSocketMessage; import org.eclipse.jetty.websocket.api.annotations.WebSocket; import org.eclipse.jetty.websocket.servlet.WebSocketServlet; import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; @WebServlet(name = "chatServlet", urlPatterns = { "/chat" }) public class ChatServlet extends WebSocketServlet { private static final long serialVersionUID = 1L; private Map<Session, String> userMap = new HashMap<>(); @Override public void configure(WebSocketServletFactory factory) { factory.register(ChatSocket.class); } @WebSocket public class ChatSocket { private Session session; @OnWebSocketConnect public void onConnect(Session session) { this.session = session; } @OnWebSocketClose public void onClose(int statusCode, String reason) { userMap.remove(session); } @OnWebSocketMessage public void onMessage(String message) { String username = userMap.get(session); if (username == null) { userMap.put(session, message); } else { broadcast(username, message); } } private void broadcast(String username, String message) { for (Session s : userMap.keySet()) { try { s.getRemote().sendString("{\"username\":\"" + username + "\",\"message\":\"" + message + "\"}"); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 3. 部署过程 - 安装Tomcat服务器:下载Tomcat并解压缩到指定目录。 - 部署项目:将前端文件和后端Java文件放在项目的WebContent目录下。 - 启动Tomcat服务器:启动Tomcat服务器,并在浏览器中访问项目地址。 以上是一个简单的实现思路和部署过程,具体的实现方式需要根据您的需求和技术水平进行调整。如果您有具体的问题或需求,欢迎随时向我提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值