Как подключить два мобильных клиента через UDP-сокеты

image

Я хочу установить UDP-соединение для голосовых вызовов между двумя приложениями. Чтобы уменьшить количество транзакций через сервер, мне нужно отправить UDP-пакет напрямую от одного клиента другому, не отправляя пакеты через сервер. Но я столкнулся со следующей ситуацией:

  • Когда пакет отправляется на сервер, сервер получает его с IP-адреса маршрутизатора и случайного порта.

  • Я попытался отправить ответ с сервера клиенту через IP-адрес и порт маршрутизатора, открыв новое соединение сокета UDP, но клиент не получил ответа.

  • Я делаю то же самое, отправляя свой ответ через сокет, который уже получил сообщение клиента, и на этот раз он получил сообщение клиента.

Мне не удалось отправить пакеты UDP из других сокетов UDP (как на сервере, так и на других клиентах) моему первому клиенту, даже через IP-адрес маршрутизатора и открытый порт на нем.

Мне любопытно узнать, можно ли установить UDP-соединение между клиентом или нет?

Приведенный ниже код является правильной моделью для возврата ответа клиенту:

const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('message', (msg, rinfo) => {
    console.log(`* server got: ${msg} from ${rinfo.address}:${rinfo.port}`);

    const message = Buffer.from('Some bytes to '+rinfo.address+":"+rinfo.port);
 //////↓///////////This is the receiver socket
    server.send(message, rinfo.port, rinfo.address);
 //////↑///////////
});

server.bind(8090);

По приведенному ниже коду клиент не получит никакого ответа даже от сервера, который получил сообщение клиента прямо сейчас!

const dgram = require('dgram');
const server = dgram.createSocket('udp4');
const serverResponse = dgram.createSocket('udp4');

server.on('message', (msg, rinfo) => {
    console.log(`* server got: ${msg} from ${rinfo.address}:${rinfo.port}`);

    const message = Buffer.from('Some bytes to '+rinfo.address+":"+rinfo.port);
 ///////↓///////// This is the different socket instance
    serverResponse .send(message, rinfo.port, rinfo.address);
 ///////↑//////////
});

server.bind(8090);

person MESepehr    schedule 06.09.2020    source источник
comment
Отвечает ли это на ваш вопрос? Отправка пакетов UDP через Интернет   -  person Jeremy Friesner    schedule 07.09.2020


Ответы (1)


Это правда? вы отправляете сообщение от своего клиента, и сервер получает его, но когда вы отправляете ответ своему клиенту, клиент не получил ответа.

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

person Mahdi Saeedi    schedule 06.09.2020