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

如何基于Socket.IO搭建非HTTP的TCP端口监听服务器?

关于用Socket.IO监听纯TCP消息的问题

兄弟,先给你明确个核心点:Socket.IO没法直接搭建非HTTP的纯TCP服务器,因为它本质是基于HTTP协议的WebSocket封装,必须先完成HTTP握手才能建立连接,和你用Spring Integration tcp-outbound-channel发送的纯TCP字节流完全不兼容。所以如果你的需求是监听原生TCP消息,Socket.IO并不是合适的选择,下面给你两个更靠谱的方案:

方案一:用原生TCP服务器直接监听(推荐)

不管是用Node.js还是Java,原生的TCP API都能直接对接你的Spring Integration消息,不需要任何额外的封装。

1. Node.js 版本(用net模块)

这是最轻量的实现,适合快速做POC:

const net = require('net');

// 要监听的端口,和Spring Integration配置的目标端口一致
const LISTEN_PORT = 12345;

const server = net.createServer((socket) => {
  console.log('✅ 收到来自Spring的TCP连接');

  // 监听消息接收
  socket.on('data', (rawData) => {
    // 把字节流转成字符串(根据你的消息编码调整,比如UTF-8)
    const receivedMsg = rawData.toString('utf-8').trim();
    console.log(`📥 收到消息: ${receivedMsg}`);

    // 这里写你的验证逻辑
    if (receivedMsg.startsWith('ORDER_')) {
      console.log('✅ 消息格式验证通过');
      // 可选:给Spring返回响应
      socket.write('ACK: VALID\n');
    } else {
      console.log('❌ 消息格式验证失败');
      socket.write('NACK: INVALID\n');
    }
  });

  // 监听连接断开
  socket.on('end', () => {
    console.log('🔌 客户端连接断开');
  });

  // 处理连接错误
  socket.on('error', (err) => {
    console.error('❌ 连接出错:', err.message);
  });
});

server.listen(LISTEN_PORT, () => {
  console.log(`🚀 TCP监听服务器已启动,端口: ${LISTEN_PORT}`);
});

2. Java 版本(原生SocketServer)

如果你更熟悉Java生态,这个方案和Spring的技术栈更贴合:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class SpringTcpListener {
    public static void main(String[] args) throws IOException {
        int listenPort = 12345;
        try (ServerSocket serverSocket = new ServerSocket(listenPort)) {
            System.out.printf("🚀 TCP监听服务器启动,端口: %d%n", listenPort);
            
            while (true) {
                // 阻塞等待客户端连接
                try (Socket clientSocket = serverSocket.accept()) {
                    System.out.println("✅ 收到Spring客户端连接");
                    
                    BufferedReader inputReader = new BufferedReader(
                        new InputStreamReader(clientSocket.getInputStream(), "UTF-8")
                    );
                    OutputStream outputStream = clientSocket.getOutputStream();
                    
                    String receivedMsg;
                    while ((receivedMsg = inputReader.readLine()) != null) {
                        System.out.printf("📥 收到消息: %s%n", receivedMsg);
                        
                        // 执行验证逻辑
                        if (receivedMsg.contains("VALID_PATTERN")) {
                            outputStream.write("ACK: 验证通过\n".getBytes("UTF-8"));
                            outputStream.flush();
                        } else {
                            outputStream.write("NACK: 验证失败\n".getBytes("UTF-8"));
                            outputStream.flush();
                        }
                    }
                } catch (IOException e) {
                    System.err.printf("❌ 连接处理出错: %s%n", e.getMessage());
                }
            }
        }
    }
}

方案二:如果非要用WebSocket/Socket.IO(需修改Spring端)

如果你的场景后续需要WebSocket能力,可以把Spring Integration的发送方式改成WebSocket,而不是纯TCP。此时可以用Socket.IO服务器,但需要Spring端对应调整为发送WebSocket消息(比如用Spring Integration的WebSocket模块),但这就偏离了你原本的纯TCP需求,只做备选。

总结

如果只是要验证Spring Integration发送的纯TCP消息,原生TCP服务器是最简单直接的方案,完全不需要Socket.IO。按照上面的代码启动服务器后,配置Spring Integration的tcp-outbound-channel指向这个端口,就能直接接收并验证消息了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:02:55