Java向TypeScript Socket服务器发消息时服务器异常终止问题
Node.js TCP服务器遇ECONNRESET崩溃问题修复及多消息支持实现
问题再现
你的TypeScript TCP服务器代码:
import { createServer } from 'net'; function main() { const socketServer = createServer((socket) => { socket.on('data', function (data) { console.log('Received: ' + data.toString()); }) socket.pipe(socket); }); socketServer.listen(60001, '127.0.0.1'); } main();
Java客户端代码:
public static void main(String[] args) throws Exception { try (var socket = new Socket("127.0.0.1", 60001); var outStream = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) { outStream.write("Hey there"); outStream.flush(); } }
执行后服务器收到消息但随即崩溃,输出:
$ ts-node ./myserver.ts Received: Hey there Error: read ECONNRESET at TCP.onStreamRead (node:internal/stream_base_commons:218:20) { errno: -4077, code: 'ECONNRESET', syscall: 'read' }
问题原因
- 未捕获错误导致进程崩溃:客户端通过
try-with-resources自动关闭socket连接后,服务器的socket.pipe(socket)仍尝试从已断开的连接读取数据,触发ECONNRESET错误。由于未给socket绑定error事件处理器,Node.js会抛出未捕获错误直接终止整个进程。 - 冗余的回显逻辑:
socket.pipe(socket)是将输入流回写到输出流(消息回显),若仅需接收消息无需回显,这段代码完全多余;即使需要回显,也未处理连接关闭后的流结束逻辑。
修复方案
要实现服务器持续运行并接收多条独立消息,需做以下调整:
- 为每个客户端socket绑定
error事件处理器,避免单个连接错误导致进程崩溃 - 按需保留或移除回显逻辑
- 服务器本身天然支持多客户端连接,只要进程不崩溃就能持续接收新连接;若要同一客户端发送多条消息,需客户端保持连接不立即关闭
修改后的服务器代码
import { createServer } from 'net'; function main() { const socketServer = createServer((socket) => { console.log('新客户端连接'); // 处理收到的数据 socket.on('data', function (data) { console.log('Received: ' + data.toString().trim()); }); // 捕获socket错误,避免进程崩溃 socket.on('error', (err) => { console.log('客户端连接出错:', err.message); }); // 处理客户端断开连接事件 socket.on('end', () => { console.log('客户端断开连接'); }); // 若需要消息回显则保留该行,否则删除 // socket.pipe(socket); }); // 监听服务器级错误(如端口被占用) socketServer.on('error', (err) => { console.log('服务器出错:', err.message); }); socketServer.listen(60001, '127.0.0.1', () => { console.log('服务器已启动,监听端口60001'); }); } main();
调整客户端发送多条消息
修改Java客户端,保持连接直到所有消息发送完成:
public static void main(String[] args) throws Exception { try (var socket = new Socket("127.0.0.1", 60001); var outStream = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) { // 发送第一条消息 outStream.write("Hey there\n"); outStream.flush(); Thread.sleep(1000); // 发送第二条消息 outStream.write("Second message\n"); outStream.flush(); Thread.sleep(1000); // 发送第三条消息 outStream.write("Third message\n"); outStream.flush(); } }
效果验证
启动修改后的服务器,运行调整后的客户端,服务器输出:
服务器已启动,监听端口60001 新客户端连接 Received: Hey there Received: Second message Received: Third message 客户端断开连接
服务器不会崩溃,后续可继续接受新的客户端连接与消息。
内容的提问来源于stack exchange,提问作者Andrey Kotov
相关产品推荐
相关产品推荐

