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

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'
}

问题原因

  1. 未捕获错误导致进程崩溃:客户端通过try-with-resources自动关闭socket连接后,服务器的socket.pipe(socket)仍尝试从已断开的连接读取数据,触发ECONNRESET错误。由于未给socket绑定error事件处理器,Node.js会抛出未捕获错误直接终止整个进程。
  2. 冗余的回显逻辑: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:57:15