2016-10-28 161 views
0

我有一個用node.js寫的UDP dgram套接字服務器。 這裏是從server.js瀏覽器爲UDP(dgram)客戶端

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這裏......一切都很好.. 我需要的是:

我需要把這個客戶端代碼插入到HTML或玉頁...以便我可以使用瀏覽器連接到服務器。我無法更改服務器代碼:(

+0

[如何與使用HTML5的UDP套接字交談?](http://stackoverflow.com/questions/29532157/how-to-talk-to-udp-sockets-with-html5) –

+0

(簡答) :你不能。) –

+0

@JoeClay:沒有解決....任何可以寫在周圍的包裝... – Nikhil

回答

-1

儘管他們說它不能完成,但您在那裏只能插入常規腳本文件的唯一東西就是require語句,但我仍然嘗試捆綁的代碼,看看它是否工作。

var dgram = require('dgram'); 

就是這樣。如果你能想出一個辦法,在那裏,你的問題得到這個都會迎刃而解。你可以做到這一點可能的方式。看看這個dgram庫有一個客戶端版本,您可以在將自己的客戶端腳本包含在html/jade文檔中之前將其包含爲腳本,這可能是一個非常麻煩的解決方案,因爲代碼/語法甚至可能需要更改對於這樣的客戶ide庫。

我相信更好的選擇是使用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 /玉文件並將其鏈接到prv.js文件,browserify將輸出 4-運行您創建的捆綁包腳本:

npm run bundle 

5-測試html文件。

如果正確完成,上述過程將創建一個包含所有需求的prod.js文件。

+0

browserify無法神奇地將UDP做能力添加到瀏覽器。 – jfriend00

+0

@Victor Moreno:你有沒有測試過你的代碼......因爲你的工作環境不工作....瀏覽器控制檯顯示錯誤:prod.js:2019 Uncaught TypeError:dgram.createSocket不是函數(...) – Nikhil

+0

@ jfriend00我不認爲它會,我的意思是暗示它肯定會工作。我只是說如何創建一個工作流程,在這個工作流程中瀏覽器至少可以運行這個文件,這樣他們就可以輕鬆一點。 Nikhil,如果它說dgram.createSocket不是一個函數,這意味着包沒有被正確包含。但是,按照其他人提供的答案,Web瀏覽器不能執行UDP套接字。 –

0

從瀏覽器中的Javascript,你根本沒有能力做一個普通的UDP連接。瀏覽器的Javascript甚至不能做一個普通的TCP套接字。 JavaScript可以做到:

  • HTTP請求
  • WebSocket連接
  • 服務器發送的事件
  • 的WebRTC(在這個過程中被supported by browsers

所以,如果你正在找去談話直接從瀏覽器直接連接到你的UDP服務器,你今天不能這樣做。

以任何方式不改變UDP服務器的限制,這些都是我能想到的唯一選擇:

  1. 寫一個瀏覽器插件,可以跟你的服務器,然後你的Javascript可以與瀏覽器插件交談。客戶端當然必須下載並安裝瀏覽器插件。

  2. 編寫一個新的服務器,可以作爲您的UDP服務器的代理(可以很容易地在node.js中完成)。如果新服務器是一個webSocket或socket.io服務器,然後您的瀏覽器Javascript可以使用webSocket或socket.io直接與代理交談,那麼新服務器可能工作得最好。代理會處理與你的UDP服務器的通信。


如果不緩解修改服務器的限制,服務器設計可如果你改變了服務器是一個WebSocket伺服器與瀏覽器的Javascript兼容(或者socket.io這是建立在webSocket的頂部,並添加了一堆有用的功能)。

+0

看起來像一個繁瑣的解決方案,但讓我看看我是否可以得到它的工作。我想到了一些代理服務器類的事情,但然後有服務器的限制..看看我是否可以解除這個約束無論如何.. .. – Nikhil