![](/img/trans.png)
[英]Vue.js + Nuxt.js: Can't connect with socket server using socket.io-client
[英]How to connect Socket.IO-Client to Sails.js server?
我花了很長時間嘗試將Socket.IO-Client連接到在Sails.js框架上運行的服務器。 客戶端基本上是一個簡單的JavaScript應用程序,在Raspberry Pi上與Node.js一起運行。
這個想法是,一個簡單的設備連接到服務器,然后服務器注冊該設備並為其訂閱消息。 設備從服務器接收消息並執行一些操作。 我不希望客戶端依賴於任何框架,因此,我試圖避免使用Sailsjs-socket.io-client。 目前,服務器和客戶端都在我的本地計算機上運行。 這是代碼:
// Server side. Sails.js. DevicesController.js module.exports = { handshake: function (req, res) { if (!req.isSocket) return res.badRequest(); Devices.create({}).exec(function (error, data) { Devices.subscribe(req.socket, data); }); return res.ok(); } }; // Client side var socket = require('socket.io-client')('http://localhost:1337/devices/handshake'); socket.on('error', function(e) { console.log(e); // Here I get 'Invalid namespace' });
因此,我在客戶端收到錯誤“無效名稱空間”,如果我是對的,則意味着服務器沒有打開“ / devices / handshake”。 但是,在服務器端,如果我列出現有的會議室ID(sails.sockets.rooms()),則可以看到當客戶端嘗試連接到服務器時始終會創建一個新會議室。
我嘗試使用下面的javascript從瀏覽器連接到“ / devices / handshake”,顯然可以正常工作。 它顯然可以與Sailsjs-socket.io-client一起運行。
io.socket.get('/devices/handshake', function (data, jwres) { console.log(jwres); }); io.socket.on('devices', function (data, jwres) { console.log(data); });
有什么想法我做錯了嗎?
似乎您在這里混淆了一些概念:Socket.io名稱空間,Socket.io路徑和Sails路由。 通過瀏覽Socket.io文檔,您可以學到更多有關前兩個方面的知識 。 就Sails而言,要記住的主要事情是,它僅偵聽default /
名稱空間上的連接。 因此,您應始終將客戶端套接字與:
var socket = require('socket.io-client')('http://localhost:1337');
將/devices/handshake
添加到末尾不會更改套接字嘗試連接的URL; 它將始終嘗試連接到http://localhost:1337/socket.io
。 相反,這意味着它將嘗試向Sails未提供的/devices/handshake
命名空間注冊套接字。
另一方面,當您調用io.socket.get('/devices/handshake')
,您正在使用Sails套接字客戶端庫向應用程序中的該路由發出虛擬請求,就像您曾經使用過AJAX(例如jQuery中的$.get('/devices/handshake')
)。 這就是為什么創建sails.io.js
原因-它使這種事情變得非常容易! 它也並沒有真正把您束縛在前端上。 sails.io.js
所做的全部工作就是提供一些包裝,以sails.io.js
通過套接字與Sails后端進行通信的過程。 在io.socket.get
, io.socket.get
只是使用Socket.io-client .emit()
方法將get
事件發送到服務器,並帶有描述URL和運行Sails操作參數的有效負載。 所以這:
io.socket.get('/devices/handshake', function(body, res){...})
等效於連接您自己的套接字並執行以下操作:
socket.emit('get', {url: '/devices/handshake'}, function(res){...})
建議在套接字第一次連接時為該套接字運行邏輯的方法是允許該套接字在客戶端上完全連接,然后從客戶端向服務器發出請求(正是您在第二個代碼塊中所做的事情)。 要了解有關其背后原因的更多信息,請參閱Sails 0.11.x遷移指南中的此注釋 。 該注釋還說明,如果由於某種原因必須在服務器連接后立即運行邏輯,則可以執行
sails.io.on('connect', function (newlyConnectedSocket){})
在您的引導功能( config/bootstrap.js
)中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.