【问题标题】:Node JS Events Emitter on net.createservernet.createserver 上的节点 JS 事件发射器
【发布时间】:2020-12-24 03:25:52
【问题描述】:

所以我遇到了一个问题并停留了大约 3 天,我使用节点 js 作为套接字服务器来接收字符串并处理一些 json 数据以向套接字客户端提供字符串响应,节点 js 中使用的堆栈(网络,事件),我的代码对于第一个请求没有问题,但是在第二个请求之后它得到了这样的错误(服务器):

[2020-12-23T07:45:13.821Z] server listening on port: 4444
[2020-12-23T07:45:15.696Z] New Connection : ::ffff:127.0.0.1
[2020-12-23T07:45:15.701Z] message: string
[2020-12-23T07:45:15.702Z] executing call function
[2020-12-23T07:45:15.703Z] oncall function
[2020-12-23T07:45:15.703Z] executing emit
[2020-12-23T07:45:15.704Z] {
  orig: 'orig',
  origParam: { number: '123456' },
  resp: [
    {
      content: [Array],
      firstPage: true,
      lastPage: true,
      number: 0,
      numberOfElements: 1,
      size: 1,
      sort: null,
      totalElements: 1
    },
    { result: 'UNMATCHED' }
  ]
}
[2020-12-23T07:45:15.707Z] Returning : diterima
[2020-12-23T07:45:42.403Z] New Connection : ::ffff:127.0.0.1
[2020-12-23T07:45:42.407Z] message: string
[2020-12-23T07:45:42.408Z] executing call function
[2020-12-23T07:45:42.408Z] oncall function
[2020-12-23T07:45:42.409Z] executing emit
[2020-12-23T07:45:42.409Z] {
  orig: 'orig',
  origParam: { number: '123456' },
  resp: [
    {
      content: [Array],
      firstPage: true,
      lastPage: true,
      number: 0,
      numberOfElements: 1,
      size: 1,
      sort: null,
      totalElements: 1
    },
    { result: 'UNMATCHED' }
  ]
}
[2020-12-23T07:45:42.410Z] Returning : diterima
[2020-12-23T07:45:42.411Z] {
  orig: 'orig',
  origParam: { number: '123456' },
  resp: [
    {
      content: [Array],
      firstPage: true,
      lastPage: true,
      number: 0,
      numberOfElements: 1,
      size: 1,
      sort: null,
      totalElements: 1
    },
    { result: 'UNMATCHED' }
  ]
}
[2020-12-23T07:45:42.412Z] Returning : diterima
events.js:288
      throw er; // Unhandled 'error' event
      ^

Error: This socket has been ended by the other party
    at Socket.writeAfterFIN [as write] (net.js:451:14)
    at HanaconsResponded.<anonymous> (C:\Users\ralfian\--\--\--.js:47:11)
    at HanaconsResponded.emit (events.js:323:22)
    at callFunction (C:\Users\ralfian\--\--\--.js:79:23)
    at Socket.<anonymous> (C:\Users\ralfian\--\--\--.js:35:17)
    at Socket.emit (events.js:311:20)
    at addChunk (_stream_readable.js:294:12)
    at readableAddChunk (_stream_readable.js:271:13)
    at Socket.Readable.push (_stream_readable.js:209:10)
    at TCP.onStreamRead (internal/stream_base_commons.js:186:23)
Emitted 'error' event on Socket instance at:
    at emitErrorNT (net.js:1336:8)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  code: 'EPIPE'
}

下面是客户端在第二次请求时出错,(第一次请求没有问题):

CLIENT: I connected to the server.
{"orig":"orig","origParam":{"number":"123456"},"resp":[{"content":[{"gender":"not match"}],"firstPage":true,"lastPage":true,"number":0,"numb
erOfElements":1,"size":1,"sort":null,"totalElements":1},{"result":"UNMATCHED"}]}
events.js:288
      throw er; // Unhandled 'error' event
      ^

Error: read ECONNRESET
    at TCP.onStreamRead (internal/stream_base_commons.js:205:27)
Emitted 'error' event on Socket instance at:
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  errno: 'ECONNRESET',
  code: 'ECONNRESET',
  syscall: 'read'
}

这是我的服务器代码:

var net = require('net');
var server = net.createServer();
require('log-timestamp');

var hostport = 4444;

var EventEmitter = require('events');
class CheckResponded extends EventEmitter {}
var checkResponded = new CheckResponded();

server.listen({
    port : hostport,
    exclusive: true

},);
console.log('server listening on ' + 'port: ' + hostport);

server.on('connection', (e) => {


    console.log( 'New Connection : ' + e.remoteAddress );
    e.setEncoding('utf8');
    e.setTimeout(60000);
    e.on('end', () => {})
    e.on( 'timeout', () => {
        console.log('Socket Timeout. Reseting.');
        e.end();
    });
    e.on( 'data', (buff) => {
        console.log("message: " + typeof buff);
        try {
            if (buff === "exec"){
                console.log("executing call function")
                callFunction()
            }
        } catch(error){
            console.log('error on socket -> ' + error)
        }
    });

    checkResponded.on( 'event1', (f) => {
        console.log(f)
        var rmsg;
        rmsg = f;
        console.log("Returning : " + 'diterima');
        e.write(JSON.stringify(rmsg));

    });

});
function callFunction() {
    console.log('oncall function')
    var imsg = {
        "orig": "orig",
        "origParam": {
            "number": "123456",
        },
        "resp": [
            {
                "content": [
                    {
                        "gender": "not match",
                    }
                ],
                "firstPage": true,
                "lastPage": true,
                "number": 0,
                "numberOfElements": 1,
                "size": 1,
                "sort": null,
                "totalElements": 1
            },
            {
                "result": "UNMATCHED"
            }
        ]
    }
    console.log('executing emit')
    checkResponded.emit('event1', imsg);
    return
}

下面是客户端请求示例:

const net = require('net');
var host = 'localhost';

const client = net.createConnection({ port: 4444, host: host }, () => {
    console.log('CLIENT: I connected to the server.');
client.write('exec')
});
client.on('data', (data) => {
    console.log(data.toString());
    client.end();
});
client.on('end', () => {
    console.log('CLIENT: I disconnected from the server.');
});

寻求帮助,谢谢!

【问题讨论】:

    标签: node.js sockets events


    【解决方案1】:

    我看到的一件事是,您的客户端代码假定您的整个响应在一个 data 事件中到达。这不是一个安全的假设。有时可能会发生这种情况,但不能保证,如果在您调用 client.end() 时服务器未完成发送数据,您将在服务器上收到错误(就像您一样),例如:

    Error: This socket has been ended by the other party
    

    您需要在您发送的数据中使用某种协议,以便您可以解析传入的数据,然后您可以知道何时有完整的响应以及何时需要等待其余数据到达。

    此处讨论的类似问题:Detect complete data received on 'data' Event in Net module of Node.js

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多