andreyelpaev
@andreyelpaev
iOS Developer

Почему сокет разрывает соединение, nodejs?

Доброе утро, вопрос следующий. Сервер написан на nodejs, с использованием библиотеки Net. GPS трекер присылает по одному на сервер(1 информационный пакет = 42 байт), если сервер был выключен, то на трекере копятся пакеты, которые затем присылаются пачкой из 10 информационных пакетов то есть 10*42=420 байт пачка. Затем пакет разбирается и сохраняется в MySQL.

Когда присылает по 1 пакету, работает стабильно. А когда по 10 пакетов, разрывает соединение через какое-то время. В чем может быть проблема?

UPD: заметил закономерность в ошибке, всегда выбивает bytesRead: 6966

Код приема данных:
socket.on('data', function(data) {

            var data = new Buffer(data, "hex");
            data = data.toString("hex");

            var gpsData = ServerCore.decodePackage(data);

            ServerCore.emit('track', gpsData);
            ServerCore.emit('encodeTrack', data);

        });


Код сохранения в базу:
for(var i = 0; i < packages.length; i++) {
                    var sql = {
                        id: data["packages"][packages[i]].id,
                        software: data["packages"][packages[i]].software,
                        status: data["packages"][packages[i]].status,
                        latitude: data["packages"][packages[i]].latitude,
                        longitude: data["packages"][packages[i]].longitude,
                        course: data["packages"][packages[i]].course,
                        speed: data["packages"][packages[i]].speed,
                        acc: data["packages"][packages[i]].acc,
                        height: data["packages"][packages[i]].height,
                        hdop: data["packages"][packages[i]].hdop,
                        glonass: data["packages"][packages[i]].glonass,
                        gps: data["packages"][packages[i]].gps,
                        time: data["packages"][packages[i]].timestamp,
                        voltage: data["packages"][packages[i]].voltage
                    }
            pool.getConnection(function(err, connection) {
                    connection.query("INSERT INTO trackerData SET ?", sql ,function (err, result) {
                        if(err) console.log(err);
                        console.log(result);
                        connection.release();
                    });

            });
        }


Ошибка сокета:
{ [Error: Socket error]
  reason: 'Socket error',
  socket:
   { _connecting: false,
     _handle: null,
     _readableState:
      { highWaterMark: 16384,
        buffer: [],
        length: 0,
        pipes: null,
        pipesCount: 0,
        flowing: false,
        ended: false,
        endEmitted: false,
        reading: true,
        calledRead: true,
        sync: false,
        needReadable: true,
        emittedReadable: false,
        readableListening: false,
        objectMode: false,
        defaultEncoding: 'utf8',
        ranOut: false,
        awaitDrain: 0,
        readingMore: false,
        decoder: null,
        encoding: null },
     readable: false,
     domain: null,
     _events:
      { end: [Object],
        finish: [Function: onSocketFinish],
        _socketEnd: [Function: onSocketEnd],
        error: [Function],
        data: [Function],
        readable: [Function] },
     _maxListeners: 10,
     _writableState:
      { highWaterMark: 16384,
        objectMode: false,
        needDrain: false,
        ending: false,
        ended: false,
        finished: false,
        decodeStrings: false,
        defaultEncoding: 'utf8',
        length: 0,
        writing: false,
        sync: true,
        bufferProcessing: false,
        onwrite: [Function],
        writecb: null,
        writelen: 0,
        buffer: [],
        errorEmitted: true },
     writable: false,
     allowHalfOpen: false,
     onend: null,
     destroyed: true,
     bytesRead: 6966,
     _bytesDispatched: 0,
     _pendingData: null,
     _pendingEncoding: '',
     server:
      { domain: null,
        _events: [Object],
        _maxListeners: 10,
        _connections: 0,
        connections: [Getter/Setter],
        _handle: [Object],
        _usingSlaves: false,
        _slaves: [],
        allowHalfOpen: false,
        _connectionKey: '4:0.0.0.0:12300',
        maxConnections: 0 },
     _peername: { address: '85.26.233.161', family: 'IPv4', port: 17032 },
     pipe: [Function],
     addListener: [Function],
     on: [Function],
     pause: [Function],
     resume: [Function],
     read: [Function],
     _consuming: true,
     _idleNext: null,
     _idlePrev: null,
     _idleTimeout: -1 },
  settings:
   { ip: '0.0.0.0',
     port: 12300,
     connections: 0,
     maxConnections: 1000 } }
  • Вопрос задан
  • 3377 просмотров
Решения вопроса 1
andreyelpaev
@andreyelpaev Автор вопроса
iOS Developer
Проблема решена, была установлена SIM карта Мегафона, установили SIM карту MTS, разрывы пропали.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Могу предположить что проблема была в том что создавалось больше 10 (max limit по умолчанию в либе mysql) соединений к базе, так как вы вызваете pool.getConnection в цикле, да еще и при получении данных.
Вызов pool.getConnection смотрелся бы лучше в событии: createServer->function(socket), т.е возникало бы максимум по одному подключению к базе на одного сокетного подключение с трекера.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы