node.js - 如何通过 UDP 套接字连接两个移动客户端
问题描述
我想为两个应用程序之间的语音呼叫建立 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);
解决方案
这是真的?“您从客户端发送消息,服务器收到它,但是当您向客户端发送响应时,客户端没有收到响应”。
如果这是真的,那么我认为您需要使用相同的套接字对象进行发送和接收,因为您不能在设备上的同一端口上创建两个套接字对象。
推荐阅读
- java - 如何创建 Rest API 并添加时间延迟来处理?
- javascript - 在现有静态网站之上使用 Vue 添加过滤功能
- excel - 用户窗体不会打开
- php - 带有php的谷歌日历v3 api不发送与会者
- c++ - 聆听 GLFW 中的键盘输入并相应地修改对象?
- python - 为什么使用 networkx 时 dask.delayed 比串行代码花费更长的时间?
- java - 如何解决 Apache 客户端 5.0“连接已关闭”HTTPS POST 错误
- android - MotionLayout/Carousel 当前状态
- css - focus-within 适用于 Android 浏览器,但不适用于 iOS
- javascript - 为什么无法在 firebase.app() 中读取属性“app”?