如何通过UDP套接字连接两个移动客户端

问题描述

image

我想为两个应用程序之间的语音呼叫建立UDP连接。为了减少服务器上的事务,我需要将UDP数据包直接从一个客户端发送到另一个客户端,而无需通过服务器发送数据包。但是我遇到了以下情况:

  • 将数据包发送到服务器时,服务器将从路由器IP和随机端口接收数据包。

  • 我尝试通过打开新的UDP套接字连接,通过路由器IP和端口从服务器向客户端发送响应,但是客户端未收到响应。

  • 我通过在已经接收到客户端消息的套接字上发送我的响应来执行相同的操作,这次是它接收了客户端。

即使从路由器IP和打开的端口上,我也无法从其他UDP套接字(在服务器和其他客户端上)向我的第一个客户端发送UDP数据包。

我很好奇,是否可以建立客户端到客户端的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',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.address);
 ///////↑//////////
});

server.bind(8090);

解决方法

这是真的吗? “您从客户端发送了一条消息,服务器收到了,但是当您向客户端发送响应时,客户端没有收到响应。”

如果这是真的,那么我认为您需要使用相同的套接字对象进行发送和接收,因为您不能在设备的同一端口上创建两个套接字对象。