【发布时间】:2020-09-06 16:36:56
【问题描述】:
我想为两个应用程序之间的语音呼叫建立 UDP 连接。为了减少服务器上的事务,我需要将 UDP 数据包直接从一个客户端发送到另一个客户端,而不是通过服务器发送数据包。但是我遇到了以下情况:
-
当一个数据包被发送到服务器时,服务器会从路由器IP和一个随机端口接收它。
-
我尝试通过打开一个新的 UDP 套接字连接,通过路由器 IP 和端口向客户端发送响应,但客户端没有收到响应。
-
我通过已经收到客户端消息的套接字发送我的响应来做同样的事情,这次它收到了客户端。
我无法从其他 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);
【问题讨论】:
-
这能回答你的问题吗? Sending UDP packets over the Internet
标签: node.js sockets udp udpclient dgrams