node.js - Node : Never emits "end" when reading a TCP Socket

标签 node.js sockets

我是 Node.Js 的新手,我正在使用 tcp 套接字与客户端通信。由于接收到的数据是零散的,我注意到它不止一次地将“ondata”打印到控制台。我需要能够读取所有数据并将其连接起来以实现其他功能。我阅读了以下内容 http://blog.nodejs.org/2012/12/20/streams2/并认为我可以为此目的使用 socket.on('end',...)。但它从不向控制台打印“结束”。

这是我的代码:

Client.prototype.send = function send(req, cb) {
    var self = this;

    var buffer = protocol.encodeRequest(req);
    var header = new Buffer(16);
    var packet = Buffer.concat([ header, buffer ], 16 + buffer.length);

    function cleanup() {
       self.socket.removeListener('data', ondata);
       self.socket.removeListener('error', onerror);
    }

    var body = '';

    function ondata() {
    var chunk = this.read() || '';
       body += chunk;
       console.log('ondata');
    }

    self.socket.on('readable', ondata);

    self.socket.on('end', function() {
        console.log('end');
    });

   function onerror(err) {
      cleanup();
      cb(err);
   }

   self.socket.on('error', onerror);
   self.socket.write(packet);
};

最佳答案

end事件会处理TCP协议(protocol)的FIN包(换句话说:会处理close包)

事件:'结束'#

Emitted when the other end of the socket sends a FIN packet. By default (allowHalfOpen == false) the socket will destroy its file descriptor once it has written out its pending write queue. However, by setting allowHalfOpen == true the socket will not automatically end() its side allowing the user to write arbitrary amounts of data, with the caveat that the user is required to end() their side now.

关于 FIN 包:https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_termination

解决方案

我了解您的问题,网络通信存在一些数据传输间隙,并且它将您的消息拆分为一些包。您只想阅读您的全部内容。

为了解决这个问题,我建议您创建一个协议(protocol)。只需在连接消息的大小小于消息总大小之前发送一个包含消息大小的数字,继续连接 :)

我昨天创建了一个库来简化这个问题:https://www.npmjs.com/package/node-easysocket

希望对你有帮助:)

关于node.js - Node : Never emits "end" when reading a TCP Socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31088497/

相关文章:

mysql - nodejs 和非阻塞噩梦

java 如何将字符串发送到服务器(jave.net/sockets)

c - 如何通过 UDP CFSocket 发送数据包?

C - 来自文件描述符的公共(public) IP

c# - WebSocketSharp 尝试打开套接字并读取传入数据

java - 在android中将两个音频流混合成一个音频流?

node.js - Sequelizejs 模型创建回调未同步运行?

node.js - 为 Node 设置环境变量以检索

node.js - 在NodeJS中加载文件夹模块

node.js - Typescript TS2339 属性不存在