如何基于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
相关产品推荐
相关产品推荐

