0

So i got a problem and stuck around 3 days, i'm using node js as a socket server to receive string and processing some json data to give a string response to socket client, stack used in node js(net, events), my code have no problem for the first request, but after the second request it got an error like this(server):

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

and bellow is error on the client side at second request, (first request have no problem):

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

Here is my server Code:

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
}

and bellow is the client request example:

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.');
});

looking for help , Thanks!

kunci115
  • 11
  • 6

1 Answers1

0

One thing I see is that your client code assumes that your entire response arrives in one data event. That is not a safe assumption. It may sometimes happen that way, but it is not guaranteed and if the server is not done sending data when you call client.end(), you will get an error (like you are) on the server such as:

Error: This socket has been ended by the other party

You will need some sort of protocol in the data you send so that you can parse the incoming data and you can then know when you have a complete response and when you need to wait for the rest of the data to arrive.

Similar issue discussed here: Detect complete data received on 'data' Event in Net module of Node.js

jfriend00
  • 683,504
  • 96
  • 985
  • 979