Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 浏览器作为UDP(dgram)客户端_Javascript_Html_Node.js_Sockets_Udp - Fatal编程技术网

Javascript 浏览器作为UDP(dgram)客户端

Javascript 浏览器作为UDP(dgram)客户端,javascript,html,node.js,sockets,udp,Javascript,Html,Node.js,Sockets,Udp,我有一个用node.js编写的UDP dgram套接字服务器。 下面是server.js中的代码片段 var PORT = 50000; var HOST = '0.0.0.0'; var dgram = require('dgram'); var server = dgram.createSocket('udp4'); server.on('listening', function () { var address = server.address(); console.log('U

我有一个用node.js编写的UDP dgram套接字服务器。 下面是server.js中的代码片段

 var PORT = 50000;
 var HOST = '0.0.0.0';
 var dgram = require('dgram');
 var server = dgram.createSocket('udp4');

server.on('listening', function () {
var address = server.address();
console.log('UDP Server listening on ' + address.address + ":" +
address.port);
});

server.on('message', function (message, remote) {
console.log('Message',  message);
});

server.bind(PORT, HOST);
我有一个客户端可以连接到这个服务器。 下面是client.js文件:

var PORT = 50000;
var HOST = '0.0.0.0';
var dgram = require('dgram');
var message = null;

var client = dgram.createSocket('udp4');


client.on('listening', function () {
var address = client.address();
console.log('UDP Server listening on ' + address.address + ":" + 
address.port);
});

client.on('message', function (message, remote) {
console.log("got message from server ==> ",remote.address + ':' + 
remote.port +' - ' + message);
});

function sendMessage(message) {
    if (message) {
    client.send(message, 0, message.length, PORT, HOST, function (err, 
    bytes) {
        if (err) throw err;
        console.log('UDP message sent to ' + HOST + ':' + PORT);
       // client.close();
       });
   }
}
这里正常…一切都很好。。 我需要的是:


我需要将此客户端代码放入html或jade页面…以便我可以使用浏览器连接到服务器。我无法更改服务器代码:(

即使他们说这件事做不到,你唯一不能插入到常规脚本文件中的就是require语句。我仍然会尝试将代码捆绑起来,看看它是否有效

var dgram = require('dgram');
就是这样。如果你能想出一种方法来解决这个问题,你的问题就会全部解决。你可以用多种方法来解决。看看是否有这个dgram库的客户端版本,在你自己的客户端脚本包含到html/jade文档中之前,你可以将它作为脚本包含。这可能是一个非常麻烦的解决方案因为这种客户端库的代码/语法甚至可能需要更改

我认为,更好的选择是使用browserify。browserify允许您使用commonJS标准,即在客户端要求其他文件/库。因此,例如,如果您开发一个名为main.js的前端文件,您可以按照以下步骤让browserify创建一个包含main.js代码以及dgram li中的代码的包布雷,都混在一起了:

1-npm安装browserify 2-进入package.json并按照测试脚本的格式创建一个新的npm脚本(在“scripts”对象内):

"bundle": "browserify path/to/jsfile/main.js -o path/to/outputfile/prod.js"
3-创建html/jade文件,并将其链接到browserify将输出的prod.js文件 4-运行您创建的捆绑包脚本:

npm run bundle
5-测试html文件


如果正确执行上述过程,将创建一个包含所有要求的单个prod.js文件。

从浏览器中的Javascript,您根本无法进行普通UDP连接。浏览器Javascript甚至不能进行普通TCP套接字。Javascript可以:

  • HTTP请求
  • 网箱连接
  • 服务器发送事件
  • webRTC(正在进行中)
因此,如果您希望从直接浏览器Javascript直接与UDP服务器进行对话,那么从今天起,您就无法做到这一点

由于受到不以任何方式更改UDP服务器的限制,我只能考虑以下选项:

  • 编写一个可以与服务器对话的浏览器加载项,然后Javascript可以与浏览器加载项对话。当然,客户端必须下载并安装浏览器加载项

  • 编写一个可以作为UDP服务器代理的新服务器(可以在node.js中轻松完成)。如果新服务器是webSocket或socket.io服务器,则可能工作得最好,然后浏览器Javascript可以使用webSocket或socket.io直接与代理对话。然后代理将处理与UDP服务器的通信



  • 如果您解除了不修改服务器的限制,那么如果您将服务器更改为webSocket服务器(或者可能是构建在webSocket之上并添加了一系列有用功能的socket.io),服务器设计可能与浏览器Javascript兼容。

    可能的重复(简短回答:您不能。)@JoeClay:没有解决方法…任何可以编写的包装器…不,浏览器不能直接进行UDP通信。是一个基于UDP的API,可在浏览器中使用,但您必须重写服务器代码以支持它。@JoeClay:感谢您的澄清:)browserify无法神奇地将UDP添加到浏览器中。@Victor Moreno:您的代码是否经过测试…因为您的解决方案不起作用…浏览器控制台显示错误:prod.js:2019 Uncaught TypeError:dgram.createSocket不是一个函数(…)@jfriend00我认为不会,我也不想暗示它肯定会起作用。我刚才说的是如何创建一个工作流程,让你的浏览器至少运行文件,这样他们就可以试一试了。Nikhil,如果它说dgram.createSocket不是一个函数,这意味着包没有被正确包含。但是根据其他人的回答,,web浏览器无法使用UDP套接字。这似乎是一个很麻烦的解决方案,但让我们看看我是否能让它正常工作。我正在考虑代理服务器之类的事情,但后来出现了服务器约束。让我们看看我是否能解除此约束。我不想投票否决答案,由于作者的创造性:)但如果您理解这两种协议的主要区别,那么将UDP封装在TCP()中并不是您想要的。@MladenB。-我不确定你的评论或你的webSocket描述链接是什么意思。最初的问题提出了一个您无法更改的UDP服务器,并希望通过浏览器连接到该服务器。由于浏览器不提供UDP接口,因此问题在这种情况下受到过度约束,因此只能选择kludges。WebSocket是通过TCP实现的,因此是链接。将UDP通信包装到TCP协议中是毫无意义的,因为这两个协议中存在有意的差异。TCP设计用于保证数据包交付(例如下载文件)的情况,UDP设计用于直播流,在直播流中,您不在乎是否丢失了一些数据包,到达目的地的下一个数据包将继续显示直播流…@MladenB。-在这个问题上,请不要试图教这里的任何人UDP和TCP之间的区别。这不是这个问题或这个答案的重点,与眼前的问题完全无关。OP有一个UDP服务,他们希望通过浏览器与之通信。没有UDP选项,因此您必须通过HTTP或webSocket一起进行黑客攻击。是的,这是一个黑客,b