gpt4 book ai didi

javascript - NodeJS,Express与Socket.io交互

转载 作者:行者123 更新时间:2023-12-03 02:01:05 27 4
gpt4 key购买 nike

当前正在使用同时使用express.jsSocket.io的Node.JS后端。该应用程序的基础看起来像这样:

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

app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});

io.on('connection', function(socket){
console.log('a user connected');
});

http.listen(3000, function(){
console.log('listening on *:3000');
});


因此,如果我理解正确,那么 express.js会处理所有 HTTP/HTTPS请求,而 Socket.io会处理与websocket有关的所有交互。因此,这是两个完全分离的实体。启动应用程序后, express部分正在侦听 http请求,而 socket.io部分正在侦听websocket事件或连接(通过 HTTP(使用 HTTP标头进行的websocket握手)进行连接)。因为 express实例和 socket.io实例共享相同的 HTTP服务器,所以它们可以使用相同的TCP连接。

问题:


我上面描述的当前理解正确吗?
这两个实体可以通过什么方式相互交互?

最佳答案

要真正了解其工作原理,您必须真正了解socket.io连接如何工作,然后才能查看它与http服务器的关系。


默认的socket.io连接以几个http请求开始。这是socket.io客户端与服务器协商以决定两者都可以支持的方式的方式。这些http请求将发送到您的node.js Web服务器(用于Express的服务器)。插入socket.io的请求处理程序将拦截这些请求并进行处理,以使它们不会发送到您的Express路由。
在像上一个这样的几个http请求之后,如果双方都同意可以将webSocket连接作为正在进行的socket.io连接的基础传输,则socket.io客户端会向服务器发送一个特殊的http请求,其中包含几个自定义标题。
http服务器(与用于Express的服务器相同)接收到此特殊的http请求,socket.io服务器代码再次拦截并处理该请求。在这种情况下,它通过对WebSocket协议进行“升级”来响应此特殊的http请求,并且将以http请求开始的套接字转换为webSocket协议,并成为仅使用webSocket协议的长期套接字。
此时,http Web服务器不再参与进一步的通信。从http请求开始的套接字已经移交给socket.io服务器代码,并且该套接字现在正在使用webSocket协议。此时,客户端或服务器都可以通过该套接字发送消息,并且另一端的相应代码将接收它们。
现在,socket.io实际上在webSocket之上使用了一层。虽然基础数据包已针对webSocket协议进行了格式化,但socket.io在webSocket之上添加了自己的应用程序层,这意味着您必须在两端都具有socket.io代码才能正常工作(socket.io客户端无法与普通的webSocket服务器对话,反之亦然)。



  因此,如果我理解正确,express.js会处理所有HTTP / HTTPS请求,而Socket.io会处理与websocket有关的所有交互。


有点。 http服务器(作为Express的基础)处理所有传入的HTTP请求。这包括将通过Express路由的常规http请求,但也包括与打开和建立socket.io连接有关的http请求。这些特殊请求由socket.io插入的http服务器请求处理程序处理,而不是通过Express进行处理。


  因此,这是两个完全分离的实体。


有一个http服务器,然后有一些请求处理程序来决定Express应该处理请求还是socket.io应该处理请求。一次,请求已传递给另一个请求,它们几乎是分开的。

但是,在某些方面它们可以相交。例如,如果您使用带有Express的会话管理器来设置会话cookie或设置cookie的任何其他类型的代码,则这些cookie也可用于socket.io连接。因此,使用正确的支持代码,socket.io连接可以访问您的Express中间件或请求处理程序创建的会话对象(或其他cookie)。请记住,socket.io连接以http请求开头,因此浏览器通常会通过http请求发送的任何cookie也将存在于socket.io请求中。


  应用程序启动后,快速部分正在侦听http请求,而socket.io部分正在侦听websocket事件或连接(使用HTTP完成连接,使用HTTP标头进行websocket握手)。


如上所述,http服务器正在侦听传入的http请求,socket.io和Express都有请求处理程序,这些处理程序查看这些传入的请求并确定是否应参与处理该请求。一些传入请求定向到socket.io服务器代码,而另一些定向定向到快速路由处理程序。


  因为express实例和socket.io实例共享相同的HTTP服务器,所以它们可以使用相同的TCP连接。


他们实际上并不共享TCP连接。有一个共享的HTTP服务器,用于侦听传入的HTTP请求。然后,这些请求将路由到socket.io代码或表达代码,以基于请求中的数据进行进一步处理。如果这是发起socket.io连接的socket.io请求,则该TCP套接字将被“升级”为webSocket协议,并且只有socket.io服务器代码会从那时开始处理该TCP套接字。如果不是socket.io请求,则将http请求传递到Express代码,并根据定义的中间件和路由决定如何处理它。


  我上面描述的当前理解正确吗?


部分正确,部分不正确。上面有很多细节。


  这两个实体可以通过什么方式相互交互?


他们共享http服务器。他们共享对cookie的访问。

使用正确的服务器端代码,可能有一个http请求(通常是来自已加载网页的Ajax调用)进入Express,并且该请求处理程序可以通过其相应的socket.io连接将数据发送到该特定客户端。使用某种cookie客户端标识符,可以将现有的socket.io连接与传入的http请求关联。



我应该补充一点,我上面所描述的是当您建立一个socket.io连接到加载该网页的相同主机和端口时的工作方式。这不是必需的。您可能有一个从中加载了所有网页和Web资源的http服务器,还有一个对传入的socket.io请求进行字段处理的http服务器(在不同的主机/端口组合上)。在这种情况下,事物的表达方面实际上与socket.io事物无关。他们实际上是不同的服务器,可能不会共享cookie等。

关于javascript - NodeJS,Express与Socket.io交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50024521/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com