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

时间:2016-10-28 14:21:06

标签: 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('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();
       });
   }
}

Uptil here ...一切都很好.. 我需要的是:

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

2 个答案:

答案 0 :(得分:0)

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

因此,如果您希望通过直接浏览器Javascript直接与您的UDP服务器对话,那么您今天就无法做到这一点。

由于不以任何方式更改UDP服务器的限制,这些是我能想到的唯一选项:

  1. 编写一个可与​​您的服务器通信的浏览器插件,然后您的Javascript可以与浏览器插件通信。当然,客户端必须下载并安装浏览器插件。

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

  3. 如果您解除了不修改服务器的限制,如果您将服务器更改为webSocket服务器(或者也许是基于webSocket构建的socket.io并添加了一堆服务器,则服务器设计可以与浏览器Javascript兼容)有用的功能)。

答案 1 :(得分:-2)

尽管他们说它无法完成,但你唯一能够进入常规脚本文件的是require语句。我仍然尝试捆绑该代码,看看它是否有效。

var dgram = require('dgram');

那就是它。如果只有你能想出办法让你的问题得到解决。你可以这样做。查看是否存在此dgram库的客户端版本,您可以在将自己的客户端脚本包含在html / jade文档中之前将其作为脚本包含在内。这可能是一个非常麻烦的解决方案,因为代码/语法甚至可能需要为这样的客户端库进行更改。

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

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

"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文件。