【发布时间】:2015-07-06 03:35:54
【问题描述】:
我正在使用 nodejs-websocket 模块运行 websocket 服务。
我想在未使用 websocket 协议的连接尝试时检测并采取一些措施。
我考虑过使用 setTimeout(n) 并在 conn.readystate 从“正在连接”变为“打开”或在计时器到期时采取行动时清除超时,但我希望有更直接的方法.
如何检测非 websocket 连接尝试?
【问题讨论】:
我正在使用 nodejs-websocket 模块运行 websocket 服务。
我想在未使用 websocket 协议的连接尝试时检测并采取一些措施。
我考虑过使用 setTimeout(n) 并在 conn.readystate 从“正在连接”变为“打开”或在计时器到期时采取行动时清除超时,但我希望有更直接的方法.
如何检测非 websocket 连接尝试?
【问题讨论】:
websocket 协议以 HTTP 请求开始每个连接,该请求带有一个“请求”升级到 webSocket 协议的标头集。当服务器都同意时,它会响应升级,然后客户端和服务器都将协议更改为 webSocket 协议。
因此,非 webSocket 连接尝试要么是普通的 HTTP 连接,要么只是一个甚至不是 HTTP 的套接字连接尝试。因此,无论哪种情况,HTTP 服务器上的连接都会以 404(Web 服务器没有响应的 HTTP 请求)或无效协议(不是 HTTP)的形式终止。
【讨论】:
Connection 有一个错误事件,所以你可以做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请求。
【讨论】:
DEBUG=* 看到这一点。理论上你可以插入底层的 Engine.io 框架,但它们并没有明确说明如何。我尝试了一些简单的事情,但没有任何效果。我的回答可能对你不起作用。您可能需要根据请求的格式实现/找到一些东西来处理请求。