You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将基于Java Socket的聊天服务器与ReactJS前端对接?

React 前端对接 Java Socket 服务端的两种实现方案

方案一:将 Java Socket 服务端改造为 WebSocket 服务端

浏览器环境不支持直接调用 TCP Socket,但原生支持 WebSocket 协议,因此可以把现有 Java Socket 服务端升级为兼容 WebSocket 的服务,直接和 React 前端通信。

Java 服务端改造示例(基于 Spring Boot)

借助 Spring Boot 快速集成 WebSocket,适配前端通信:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ChatWebSocketHandler(), "/chat")
                .setAllowedOrigins("*"); // 生产环境需替换为具体业务域名
    }
}

public class ChatWebSocketHandler extends TextWebSocketHandler {
    private static final List<WebSocketSession> sessions = new CopyOnWriteArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
        System.out.println("新客户端连接:" + session.getId());
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 复用原Java Socket的业务逻辑,或直接转发消息
        String payload = message.getPayload();
        for (WebSocketSession s : sessions) {
            if (s.isOpen()) {
                s.sendMessage(new TextMessage(payload));
            }
        }
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
        System.out.println("客户端断开连接:" + session.getId());
    }
}

React 前端实现

直接使用浏览器原生 WebSocket API 建立连接:

import { useEffect, useRef, useState } from 'react';

function ChatComponent() {
    const [message, setMessage] = useState('');
    const [chatHistory, setChatHistory] = useState([]);
    const wsRef = useRef(null);

    useEffect(() => {
        // 连接WebSocket服务端
        wsRef.current = new WebSocket('ws://localhost:8080/chat');
        
        wsRef.current.onopen = () => console.log('WebSocket连接成功');
        wsRef.current.onmessage = (event) => setChatHistory(prev => [...prev, event.data]);
        wsRef.current.onclose = () => console.log('WebSocket连接断开');

        // 组件卸载时关闭连接
        return () => wsRef.current?.close();
    }, []);

    const sendMessage = () => {
        if (wsRef.current && message.trim()) {
            wsRef.current.send(message);
            setMessage('');
        }
    };

    return (
        <div>
            <div className="chat-history">
                {chatHistory.map((msg, index) => <div key={index}>{msg}</div>)}
            </div>
            <input
                type="text"
                value={message}
                onChange={(e) => setMessage(e.target.value)}
                onKeyPress={(e) => e.key === 'Enter' && sendMessage()}
            />
            <button onClick={sendMessage}>发送</button>
        </div>
    );
}

export default ChatComponent;

方案二:通过 Node.js 中间层转发(无需改造原 Java Socket 服务端)

如果不想修改现有 Java TCP Socket 服务端,可使用 Node.js 作为中转:Node.js 用 net 模块对接 Java Socket,同时向 React 提供 WebSocket 接口,实现消息双向转发。

Node.js 中间层代码

const net = require('net');
const WebSocket = require('ws');

// 连接Java Socket服务端
const javaSocketClient = new net.Socket();
javaSocketClient.connect(8888, 'localhost', () => {
    console.log('已连接到Java Socket服务端');
});

// 创建WebSocket服务供React前端连接
const wss = new WebSocket.Server({ port: 3001 });

wss.on('connection', (ws) => {
    console.log('新前端客户端连接');

    // 前端消息转发到Java服务端
    ws.on('message', (data) => javaSocketClient.write(data.toString()));

    // Java服务端消息转发到前端
    javaSocketClient.on('data', (data) => ws.send(data.toString()));

    ws.on('close', () => console.log('前端客户端断开连接'));
});

React 前端实现

仅需修改 WebSocket 连接地址为 Node.js 服务地址即可:

// 替换为Node.js的WebSocket服务地址
wsRef.current = new WebSocket('ws://localhost:3001');

内容的提问来源于stack exchange,提问作者user20384808

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:15:46