首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java WebSocket 實戰:從零構建網頁聊天室完整教程

     編輯:Java 相關知識

前言:為什麼選擇 WebSocket?

傳統 HTTP 輪詢模式存在嚴重缺陷:客戶端頻繁發起請求,Header 開銷大,實時性差。HTML5 WebSocket 協議解決了這些問題:

  • 極小 Header:握手後僅 2 Bytes 開銷。
  • 全雙工通訊:服務端可主動推送,無需客戶端輪詢。
  • Java EE 7+ 原生支持:標準 API,跨容器部署無憂。

項目技術棧

  • 後端:Java EE 7, Tomcat 7+, JSR 356 WebSocket API
  • 前端:AmazeUI (響應式框架), UMEditor (富文本編輯器), jQuery
  • 構建:Eclipse JavaEE, Maven (可選)

項目結構搭建

  1. 創建 Dynamic Web Project:Chat
  2. 導入 JSON 處理依賴:json-lib, ezmorph, commons-* 等 JAR 至 WEB-INF/lib
  3. 部署至 Tomcat,驗證空項目運行正常

前端頁面開發

1. 引入靜態資源

  • AmazeUI:解壓 assets 目錄至 WebContent
  • UMEditor:下載 JSP Mini 版,解壓 umeditor 目錄至 WebContent

2. index.jsp 核心代碼

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="utf-8">
    <title>ShiYanLou Chat</title>
    <link rel="stylesheet" href="assets/css/amazeui.min.css">
    <link rel="stylesheet" href="assets/css/app.css">
    <link href="umeditor/themes/default/css/umeditor.css" rel="stylesheet">
    <style>
        .chat-content-container { height: 29rem; overflow-y: scroll; border: 1px solid silver; }
    </style>
</head>
<body>
    <!-- 標題區 -->
    <div class="title"><h1 class="am-text-primary">ShiYanLou Chat</h1></div>

    <!-- 聊天內容區 -->
    <div class="chat-content">
        <ul id="message-list" class="am-comments-list am-comments-list-flip"></ul>
    </div>

    <!-- 輸入區 -->
    <div class="message-input am-margin-top">
        <script type="text/plain" id="myEditor"></script> <!-- UMEditor -->
        <input id="nickname" type="text" placeholder="Please enter nickname"/>
        <button id="send" class="am-btn am-btn-primary"><i class="am-icon-send"></i> Send</button>
    </div>

    <!-- JS 庫 -->
    <script src="assets/js/jquery.min.js"></script>
    <script src="umeditor/umeditor.config.js"></script>
    <script src="umeditor/umeditor.min.js"></script>
    <script src="umeditor/lang/zh-cn/zh-cn.js"></script>

    <script>
        $(function() {
            var um = UM.getEditor('myEditor');
            $('#nickname')[0].focus();

            // 建立 WebSocket 連接
            var socket = new WebSocket('ws://${pageContext.request.getServerName()}:${pageContext.request.getServerPort()}${pageContext.request.contextPath}/websocket');

            // 接收服務端消息
            socket.onmessage = function(event) { addMessage(event.data); };

            // 發送按鈕點擊
            $('#send').on('click', function() {
                var nickname = $('#nickname').val();
                if (!um.hasContents()) { shakeEditor(); return; }
                if (!nickname) { shakeNickname(); return; }

                socket.send(JSON.stringify({ content: um.getContent(), nickname: nickname }));
                um.setContent(''); um.focus();
            });

            function addMessage(data) {
                var msg = JSON.parse(data);
                var html = '<li class="am-comment ' + (msg.isSelf ? 'am-comment-flip' : '') + '">' +
                    '<img src="assets/images/' + (msg.isSelf ? 'self.png' : 'others.jpg') + '" class="am-comment-avater"/>' +
                    '<div class="am-comment-main"><header><a class="am-comment-author">' + msg.nickname +
                    '</a><time>' + msg.date + '</time></header>' +
                    '<div class="am-comment-bd">' + msg.content + '</div></div></li>';
                $(html).appendTo('#message-list');
                $(".chat-content-container").scrollTop($(".chat-content-container")[0].scrollHeight);
            }
            function shakeEditor() { /* 搖晃動畫 */ }
            function shakeNickname() { /* 搖晃動畫 */ }
        });
    </script>
</body>
</html>

後端 WebSocket 端點開發

ChatServer.java

package com.shiyanlou.chat;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import net.sf.json.JSONObject;
import java.text.SimpleDateFormat;
import java.util.Date;

@ServerEndpoint("/websocket")
public class ChatServer {
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm");

    @OnOpen
    public void onOpen(Session session) { /* 可做初始化 */ }

    @OnMessage
    public void onMessage(String message, Session session) {
        JSONObject json = JSONObject.fromObject(message);
        json.put("date", DATE_FORMAT.format(new Date()));

        // 廣播給所有在線會話
        for (Session openSession : session.getOpenSessions()) {
            json.put("isSelf", openSession.equals(session)); // 標記是否自己發送
            openSession.getAsyncRemote().sendText(json.toString());
        }
    }

    @OnClose public void onClose() { /* 清理資源 */ }
    @OnError public void onError(Throwable t) { t.printStackTrace(); }
}

關鍵技術點解析

  1. @ServerEndpoint("/websocket"):映射 WebSocket 路徑,前端連接地址需對應。
  2. Session.getOpenSessions():獲取所有當前連接會話,實現廣播。
  3. AsyncRemote.sendText():非阻塞發送,避免阻塞調用線程。
  4. JSON 交互協議:前後端約定字段 content, nickname, date, isSelf。

運行測試

  1. 啟動 Tomcat,訪問 https://localhost:8080/Chat/index.jsp
  2. 多開瀏覽器標籤或局域網內多設備訪問
  3. 輸入暱稱、編輯富文本消息、點擊 Send,即時收發驗證

擴展思考

  • 用戶認證與私聊(一對一)
  • 表情包、圖片、文件上傳
  • 消息持久化(數據庫/Redis)
  • 集群環境下的消息廣播
  • 心跳檢測與斷線重連

總結

本文完整演示了基於 Java 原生 WebSocket API 構建網頁聊天室的全過程:從項目搭建、前端 UI 集成、後端端點開發到前後端 JSON 交互。WebSocket 以其輕量、高效、雙向通訊特性,成為實時 Web 應用的首選技術。掌握其核心 API 與前後端協作模式,可快速構建即時通訊、協作編輯、實時監控等多類場景應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved