【问题标题】:socket.io endpoints, what/where are they coming from?socket.io 端点,它们来自什么/来自哪里?
【发布时间】:2020-07-14 19:00:58
【问题描述】:

在我非常简单的 nodejs 服务器应用程序中。我提供 socket.io (v2.2.0) 没有 express 或 http。这是我的代码。

const io = require('socket.io')();
io.on('connection', (client) => { 
    client.emit("welcome", "hello user");
 });
io.listen(3000);

(通过谷歌搜索)我发现我可以在我的网络浏览器中导航到两者 http://localhost:3000/socket.io/ 和 http://localhost:3000/socket.io/socket.io.js 这些“端点”是从哪里定义的?我的代码没有说明这些“端点”,但它们确实存在。这些是过去版本的遗留物吗?

当我访问 http://localhost:3000/socket.io/ 时,我收到一个 400 错误请求,其中包含 JSON 返回消息

{"code":0,"message":"Transport unknown"}

当我访问 http://localhost:3000/socket.io/socket.io.js 我得到了这个

!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.io=e():t.io=e()}(this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,loaded:!1};return t[n].call(o.exports,o,o.exports,e),o.loaded=!0,o.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){"use strict";function n(t,e){"object"===("undefined"==typeof t?"undefined":i(t))&&(e=t,t=void 0),e=e||{};var r,n=s(t),a=n.source,p=n.id,f=n.path,l=h[p]&&f in h[p].nsps,d=e.forceNew||e["force new connection"]||!1===e.multiplex||l;return d?(u("ignoring socket cache for %s",a),r=c(a,e)):(h[p]||(u("new io instance for %s",a),h[p]=c(a,e)),r=h[p]),n.query&&!e.query?e.query=n.query:e&&"object"===i(e.query)&&(e.query=o(e.query)),r.socket(n.path,e)}function o(t){var e=[];for(var r in t)t.hasOwnProperty(r)&&e.push(encodeURIComponent(r)+"="+encodeURIComponent(t[r]));return e.join("&")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof 
and so on

【问题讨论】:

    标签: node.js sockets socket.io


    【解决方案1】:

    socket.io 基于 webSocket 传输。而且,webSocket 传输以 http 请求开始每个连接(设置了某些标头,表明它是一个 webSocket 连接请求)。因此,当您执行 io.listen() 时,它会创建一个 webServer。

    然后,为了支持其他一些socket.io的东西(例如获取客户端socket.io库并建立新连接),它还根据/socket.io路径前缀创建路由,例如/socket.io/socket.io/socket.io.js .

    这些“端点”是从哪里定义的?

    它们是 socket.io 内部工作的一部分。

    这些是过去版本的遗留物吗?

    不,它们仍然是 socket.io 的工作方式。

    当我转到 http://localhost:3000/socket.io/ 时,我收到 400 错误请求

    该路由用于新的 socket.io 连接,它需要各种查询参数和自定义标头才能正确完成其工作,这就是您收到错误请求的原因。

    例如,这是使用/socket.io 路由启动新socket.io 连接的请求的屏幕截图。您可以看到查询参数和自定义标头,它们是在该传输之上设置 webSocket 传输和 socket.io 连接的一部分。

    【讨论】:

    • “例如获取客户端socket.io库并建立新连接”所以当我有我的socket.io-client时,我连接到哪个? var socket = require('socket.io-client')('localhost:3000') 或者 var socket = require('socket.io-client')('localhost:3000/socket.io') 从你说的我觉得是前者,但如果是这样,我将如何以及何时连接到后者?
    • (我也在代码中尝试不同的东西,所以我在试验,而不仅仅是盲目地问)TY
    • @jaxkewl - socket.io 的默认行为是几个常规的 http 请求,然后更新为 webSocket 作为传输。这最初是在不是每个客户端都可以使用 webSocket 并且某些代理不支持它时(现在很少出现这种情况)时以这种方式完成的。但是,您可以将 socket.io 配置为立即从 webSocket 开始,这就是我发布的屏幕截图所代表的内容。这是 webSocket 传输的启动(上面带有 socket.io 消息)。
    • @jaxkewl - 所有 webSocket 连接都以 http 请求开始,然后双方同意将同一个 TCP 套接字的协议切换到 webSocket 协议,这与 socket.io 无关 - 的socket.io 使用的 webSocket 传输也以相同的方式启动(使用 http 请求)..
    • @jaxkewl - 当您将http://localhost:3000 指定为您的socket.io 服务器时,socket.io 客户端库会在联系服务器之前自动将/socket.io 添加到路径中。你不这样做。它为你做到了。连接时,您根本不必知道/socket.io 路径。唯一一次指定它是在指定客户端 socket.io 库 URL 时,因为这是一个普通的浏览器 URL,而不是 socket.io 客户端参与的内容(因为它尚未加载)。
    猜你喜欢
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2014-09-08
    相关资源
    最近更新 更多