我正在使用nodejs-websocket模塊運行websocket服務。nodejs-websocket檢測非websocket連接嘗試
我想檢測並採取一些行動時,進行連接嘗試不使用websocket協議。
我想過使用setTimeout(n)並清除conn.readystate從'連接'變爲'打開'或在定時器過期時採取行動時的超時,但我希望有一個更直接的辦法。
如何檢測非websocket連接嘗試?
我正在使用nodejs-websocket模塊運行websocket服務。nodejs-websocket檢測非websocket連接嘗試
我想檢測並採取一些行動時,進行連接嘗試不使用websocket協議。
我想過使用setTimeout(n)並清除conn.readystate從'連接'變爲'打開'或在定時器過期時採取行動時的超時,但我希望有一個更直接的辦法。
如何檢測非websocket連接嘗試?
webocket協議啓動與HTTP請求的每個連接,頭部設置爲「請求」升級到webSocket協議。當兩個服務器都同意時,它會響應升級,然後客戶端和服務器都將協議更改爲webSocket協議。
因此,非webSocket連接嘗試將是普通的HTTP連接,或者它只是一個甚至不是HTTP的套接字連接嘗試。因此,無論哪種情況,連接都將作爲404(Web服務器沒有響應的HTTP請求)或作爲無效協議(而不是HTTP)而死在HTTP服務器上。
連接有錯誤事件,所以你可以做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請求。
非webSocket連接將永遠不會到socket.io,因此您將無法使用socket.io的錯誤處理。實際發生的事情取決於非webSocket連接的實際連接類型。 – jfriend00
是的,你完全正確。 Engine.io(Socket.io運行的東西)會消耗所有的請求,並且它永遠不會遇到Express.You可以通過'DEBUG = *'看到。理論上你可以插入底層的Engine.io框架,但是它們並沒有使它明顯如此。我嘗試了一些簡單的事情,但無法獲得任何工作。我的答案可能不適合你。您可能需要根據請求的格式來實現/查找處理請求的內容。 –
感謝您的回答。我寧願一個解決方案,不需要一個單獨的Web服務器來滿足我的要求,但你所說的是正確的。 – RoyHB
@RoyHB - 由於每個webSocket請求都是作爲HTTP請求啓動的,因此您至少沒有能夠響應HTTP請求的裸機服務器,就無法檢測到傳入的webSocket連接(以及非webSocket請求)。因此,如果沒有至少缺少骨幹HTTP服務器,則無法接受傳入的webSocket請求。如果nodejs-webSocket支持傳入的webSocket請求,那麼它已經是一個HTTP服務器。 – jfriend00