2015-07-06 101 views
0

我正在使用nodejs-websocket模塊運行websocket服務。nodejs-websocket檢測非websocket連接嘗試

我想檢測並採取一些行動時,進行連接嘗試不使用websocket協議。

我想過使用setTimeout(n)並清除conn.readystate從'連接'變爲'打開'或在定時器過期時採取行動時的超時,但我希望有一個更直接的辦法。

如何檢測非websocket連接嘗試?

回答

2

webocket協議啓動與HTTP請求的每個連接,頭部設置爲「請求」升級到webSocket協議。當兩個服務器都同意時,它會響應升級,然後客戶端和服務器都將協議更改爲webSocket協議。

因此,非webSocket連接嘗試將是普通的HTTP連接,或者它只是一個甚至不是HTTP的套接字連接嘗試。因此,無論哪種情況,連接都將作爲404(Web服務器沒有響應的HTTP請求)或作爲無效協議(而不是HTTP)而死在HTTP服務器上。

+0

感謝您的回答。我寧願一個解決方案,不需要一個單獨的Web服務器來滿足我的要求,但你所說的是正確的。 – RoyHB

+0

@RoyHB - 由於每個webSocket請求都是作爲HTTP請求啓動的,因此您至少沒有能夠響應HTTP請求的裸機服務器,就無法檢測到傳入的webSocket連接(以及非webSocket請求)。因此,如果沒有至少缺少骨幹HTTP服務器,則無法接受傳入的webSocket請求。如果nodejs-webSocket支持傳入的webSocket請求,那麼它已經是一個HTTP服務器。 – jfriend00

0

連接有錯誤事件,所以你可以做Connection.on('error', function(err) ...。這將意味着連接出了問題,但我不相信您可以在此時使用連接進行任何操作。

一個建議是使用Socket.io,它可以在HTTP/Connect/Express服務器上進行派對。它可以說HTTP(Kinda)或WebSockets。然後,你可以這樣做:

var app = require('express')(); 
var server = require('http') 
    .Server(app); 
var io = require('socket.io')(server); 

server.listen(3000); 

app.get('/*', function(req, res) { 
    res.json({ 
    hello: 'world' 
    }); 
}); 

io.on('connection', function(socket) { 
    socket.emit('news', { 
    hello: 'world' 
    }); 
    socket.on('my other event', function(data) { 
    console.log(data); 
    }); 
}); 

這有所有/Socket.io/*路徑下的Socket.io連接。任何其他連接將通過app.get('/*',...)呼叫處理。這隻會捕獲http請求。

+0

非webSocket連接將永遠不會到socket.io,因此您將無法使用socket.io的錯誤處理。實際發生的事情取決於非webSocket連接的實際連接類型。 – jfriend00

+0

是的,你完全正確。 Engine.io(Socket.io運行的東西)會消耗所有的請求,並且它永遠不會遇到Express.You可以通過'DEBUG = *'看到。理論上你可以插入底層的Engine.io框架,但是它們並沒有使它明顯如此。我嘗試了一些簡單的事情,但無法獲得任何工作。我的答案可能不適合你。您可能需要根據請求的格式來實現/查找處理請求的內容。 –