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

Node.js中setInterval结合socket.write触发EPIPE错误的解决方案

Node.js net.Socket 定时写入数据EPIPE错误解决

需求与初始代码

Node.js开发场景下,需要通过net.Socket客户端定时向指定端口写入数据。初始可正常执行单次写入的代码如下:

var net = require('net');
var PORT = 3000;
var client = new net.Socket();
client.connect(PORT, function(){
  client.write('{printing}');
})

为了实现每隔10秒写入一次相同数据,调整代码后无法正常运行:

client.connect(PORT, function(){
   setInterval(function(){
     client.write('{ printing }');
   },10000);
 })

报错信息

运行后持续抛出EPIPE错误,日志如下:

node:events:355
      throw er; // Unhandled 'error' event
      ^

Error: write EPIPE
    at afterWriteDispatched (node:internal/stream_base_commons:160:15)
    at writeGeneric (node:internal/stream_base_commons:151:3)
    at Socket._writeGeneric (node:net:773:11)
    at Socket._write (node:net:785:8)
    at writeOrBuffer (node:internal/streams/writable:395:12)
    at Socket.Writable.write (node:internal/streams/writable:340:10)
    at Timeout._onTimeout (/app/src/index.js:135:14)
    at listOnTimeout (node:internal/timers:557:17)
    at processTimers (node:internal/timers:500:7)
Emitted 'error' event on Socket instance at:
    at emitErrorNT (node:internal/streams/destroy:188:8)
    at emitErrorCloseNT (node:internal/streams/destroy:153:3)
    at processTicksAndRejections (node:internal/process/task_queues:81:21) {
  errno: -32,
  code: 'EPIPE',
  syscall: 'write'
}
[nodemon] app crashed - waiting for file changes before starting..

错误原因

EPIPE错误的核心成因是向已经被对端关闭的Socket连接写入数据,多数场景下是服务端完成单次通信后主动断开了连接,后续定时写入时连接已经失效,且初始代码没有监听Socket的错误、断开事件,也没有重连逻辑,直接触发未捕获异常导致程序崩溃。

修复代码

通过监听Socket全生命周期事件、增加异常重连逻辑即可解决问题,最终可用代码如下:

client.connect(PORT, function(){
    client.write('printing')
  })

  // 缓冲区满时触发drain事件,排空缓冲区后再执行写入避免数据丢失
  client.on('drain',()=>{
    console.log("draining the buffer")
    setTimeout(() => {
        client.write('printing')
    })

    // 消费服务端返回的响应数据(示例中响应为"ok")
  client.on('data', (data) => {})

  // 错误捕获+断连自动重连逻辑
  client.on('error',err => {}).on('close',() => {
    setTimeout(() => {
      client.connect(PORT, function(){
        client.write('printing')
  
      })
    },40000)
  })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 08:45:03