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

Node.js net库Socket.write()是否转UTF-8及发送前内容检查方法

Node.js net.Socket.write() 编码与内容检查

1. Socket.write() 对字符串的编码处理

当调用 socket.write() 传入字符串时,默认会将字符串转换为 UTF-8 编码的 Buffer 再发送。如果需要指定其他编码,可以在 write() 的第二个参数传入编码类型(比如 'ascii'、'base64' 等),此时会用指定编码转换字符串。

示例代码:

// 默认用 UTF-8 编码发送
socket.write('Hello 世界');

// 指定用 ASCII 编码(非 ASCII 字符会被替换为 ?)
socket.write('Hello 世界', 'ascii');

2. 检查发送前的写入内容

方法一:手动预转换编码查看

在调用 write() 前,手动将字符串按对应编码转为 Buffer,直接查看 Buffer 的内容:

const str = 'Hello 世界';
// 用默认 UTF-8 编码转换
const buf = Buffer.from(str, 'utf8');
console.log('发送前的 Buffer 内容:', buf);
console.log('十六进制字节:', buf.toString('hex')); // 查看原始字节
console.log('转回字符串:', buf.toString('utf8'));

// 如果指定了编码,用对应编码转换
const asciiBuf = Buffer.from(str, 'ascii');
console.log('ASCII 编码的 Buffer:', asciiBuf);

方法二:重写 write 方法拦截记录

通过重写 Socket 的 write 方法,在实际发送前自动记录要发送的内容:

const net = require('net');

const socket = net.createConnection({ port: 8080 }, () => {
  // 保存原始 write 方法
  const originalWrite = socket.write;
  
  // 重写 write 方法
  socket.write = function(data, encoding, callback) {
    // 处理字符串类型的 data
    if (typeof data === 'string') {
      const usedEncoding = encoding || this.encoding || 'utf8';
      const encodedData = Buffer.from(data, usedEncoding);
      console.log(`发送前(${usedEncoding} 编码):`);
      console.log('Buffer 内容:', encodedData);
      console.log('十六进制:', encodedData.toString('hex'));
    } 
    // 处理 Buffer 类型的 data
    else if (Buffer.isBuffer(data)) {
      console.log('发送前的 Buffer 内容:', data);
      console.log('十六进制:', data.toString('hex'));
    }
    
    // 调用原始 write 方法完成发送
    return originalWrite.call(this, data, encoding, callback);
  };

  // 测试发送
  socket.write('Hello 世界');
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:55:19