2016-02-03 190 views
2

我花了很長時間試圖將Socket.IO-Client連接到在Sails.js框架上運行的服務器。客戶端基本上是一個簡單的JavaScript應用程序,在Raspberry Pi上與Node.js一起運行。如何將Socket.IO客戶端連接到Sails.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); 
 
});

任何想法,我究竟做錯了什麼?

回答

5

看來你在這裏混淆了一些概念:即Socket.io命名空間,Socket.io路徑和Sails路由。您可以通過查看Socket.io docs瞭解更多關於前兩項的內容。關於Sails而言,要記住的主要是它只有偵聽缺省/名稱空間上的連接;因此,你應該總是連接客戶端與插座:

var socket = require('socket.io-client')('http://localhost:1337'); 

添加/devices/handshake到年底不會更改套接字嘗試連接到的URL;它會一直嘗試連接到http://localhost:1337/socket.io。相反,這意味着它將嘗試向套接字註冊名稱空間,而Sails沒有提供這個名稱空間。

在另一方面,當你調用io.socket.get('/devices/handshake'),您所使用的插座帆客戶端庫,使虛擬請求在您的應用程序,路線,你會在jQuery中使用AJAX(如$.get('/devices/handshake')就像)。這正是爲什麼sails.io.js被創建 - 這使得這種事情非常簡單!這也不是真的把你綁在前臺上;所有sails.io.js都提供了一些包裝,以便通過套接字與Sails後端進行通信。在封面下,io.socket.get僅使用Socket.io-client .emit()方法向服務器發送get事件,其中有一個負載描述要運行的Sails操作的URL和參數。所以,這樣的:

io.socket.get('/devices/handshake', function(body, res){...}) 

相當於連接自己的插座,這樣做:

socket.emit('get', {url: '/devices/handshake'}, function(res){...}) 

爲當它第一次連接插座運行的邏輯推薦的方法是讓插座完全連接在客戶端上,然後從客戶端向服務器發出請求(正是您在第二個代碼塊中執行的操作)。要詳細瞭解背後的原因,請參閱this note in the Sails 0.11.x migration guide。該說明還解釋說,如果你必須後立即出於某種原因服務器連接上運行的邏輯,你可以在你的自舉功能(config/bootstrap.js)做

sails.io.on('connect', function (newlyConnectedSocket){}) 

+0

嘿sgress454,我掙扎着一個類似的問題,但使用Python socketio客戶端[見我的問題](http://stackoverflow.com/questions/40949932/how-to-connect-to-sails-socket- IO-服務器從-A-蟒-客戶試圖-sailssock)。你會有更多的指針嗎? – zabumba

相關問題