Прослушивание UDP-сообщений в Express - PullRequest
0 голосов
/ 25 июня 2018

У меня есть базовый сервер Node.js, использующий Express. Он должен уметь обрабатывать как TCP-сообщения, так и UDP-сообщения. Часть TCP работает и работает отлично, но теперь мне нужно интегрировать способ, чтобы прослушивать UDP-сообщения. Я попытался добавить обработчик в стек фильтров с помощью сокета dgram, но он не увенчался успехом.

const express = require('express');
const dgram = require('dgram');

// ...

const app = express();
const dgramSocket = dgram.createSocket('udp4');

// ...

app.use((req, res, next) => {
  dgramSocket.on('listening', () => {
    let addr = app.address();
    console.log(`Listening for UDP packets at ${addr.address}:${addr.port}`);
  });

  dgramSocket.on('error', (err) => {
    console.log(`UDP error: ${err.stack}`);
  });

  dgramSocket.on('message', (msg, rinfo) => {
    console.log(`Received UDP message`);
  });

  next();

}

// ...

app.set('port', 8080);

Когда я запускаю свой сервер, все остальное работает, но мои dgram части даже не говорят, что они слушают. Я не слишком знаком с Node и, тем более, с UDP, так что могу ошибиться. Кто-нибудь смог интегрировать обмен сообщениями UDP с сервером Express?

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Похоже, я сделал несколько неудачных предположений об использовании портов. Оказывается, это можно сделать довольно просто, но вы должны прослушивать два разных порта:

const express = require('express');
const dgram = require('dgram');

// ...

const app = express();

// ... filter stack ...

const socket = dgram.createSocket('udp4');

socket.on('listening', () => {
  let addr = socket.address();
  console.log(`Listening for UDP packets at ${addr.address}:${addr.port}`);
});

socket.on('error', (err) => {
  console.error(`UDP error: ${err.stack}`);
});

socket.on('message', (msg, rinfo) => {
  console.log('Recieved UDP message');
});

app.set('port', 8080); // listen for TCP with Express
socket.bind(8082);     // listen for UDP with dgram

Работает как шарм.

0 голосов
/ 25 июня 2018

Где вы привязываете сокет к порту?Документы: https://nodejs.org/api/dgram.html#dgram_socket_bind_port_address_callback

Попробуйте позвонить dgramSocket.bind(PORT) внизу кода и посмотреть, запускает ли ваш консольный журнал.Вам (вероятно) придется переместить код сокета за пределы функции app.use ().

Если вы просто собираетесь отправлять сообщения из сокета, то я не думаю, что вам нужно привязывать его к порту, но если вы слушаете, вам нужно указать, где слушать.

...