Java websocket双向通讯实例

105 阅读2分钟

服务端代码

服务端借助 Java 的 javax.websocket API 来实现 WebSocket 服务。

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

// 定义 WebSocket 服务端点
@ServerEndpoint("/websocket")
public class WebSocketServer {

    /**
     * 当有新的客户端连接时调用此方法
     * @param session 客户端会话
     */
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("新客户端连接: " + session.getId());
        try {
            // 向客户端发送欢迎消息
            session.getBasicRemote().sendText("欢迎连接到 WebSocket 服务器!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 当接收到客户端消息时调用此方法
     * @param message 客户端发送的消息
     * @param session 客户端会话
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("收到客户端消息: " + message);
        try {
            // 向客户端回复消息
            session.getBasicRemote().sendText("服务器已收到消息: " + message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 当客户端断开连接时调用此方法
     * @param session 客户端会话
     * @param reason 断开连接的原因
     */
    @OnClose
    public void onClose(Session session, CloseReason reason) {
        System.out.println("客户端断开连接: " + session.getId() + ", 原因: " + reason.getReasonPhrase());
    }

    /**
     * 当发生错误时调用此方法
     * @param session 客户端会话
     * @param error 错误信息
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.out.println("发生错误: " + session.getId() + ", 错误信息: " + error.getMessage());
    }}

服务端启动类

import org.glassfish.tyrus.server.Server;

public class WebSocketServerMain {
    public static void main(String[] args) {
        // 创建 WebSocket 服务器实例
        Server server = new Server("localhost", 8080, "/websocket-example", WebSocketServer.class);
        try {
            // 启动服务器
            server.start();
            System.out.println("WebSocket 服务器已启动,访问 ws://localhost:8080/websocket-example/websocket");
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 停止服务器
            server.stop();
        }
    }
}

客户端代码

客户端使用 JavaScript 实现,借助浏览器自带的 WebSocket 对象。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>WebSocket Client</title>
</head>
<body>
    <input type="text" id="messageInput" placeholder="输入消息">
    <button onclick="sendMessage()">发送</button>
    <div id="output"></div>

    <script>
        // 创建 WebSocket 实例
        const socket = new WebSocket('ws://localhost:8080/websocket-example/websocket');

        // 连接成功时触发
        socket.onopen = function(event) {
            appendMessage('连接成功');
        };

        // 接收到消息时触发
        socket.onmessage = function(event) {
            appendMessage('收到服务器消息: ' + event.data);
        };

        // 连接关闭时触发
        socket.onclose = function(event) {
            appendMessage('连接已关闭');
        };

        // 发生错误时触发
        socket.onerror = function(error) {
            appendMessage('发生错误: ' + error.message);
        };

        function sendMessage() {
            const messageInput = document.getElementById('messageInput');
            const message = messageInput.value;
            if (message) {
                // 向服务器发送消息
                socket.send(message);
                appendMessage('已发送消息: ' + message);
                messageInput.value = '';
            }
        }

        function appendMessage(message) {
            const outputDiv = document.getElementById('output');
            const p = document.createElement('p');
            p.textContent = message;
            outputDiv.appendChild(p);
        }
    </script>
</body>
</html>