Javascript 我可以在不向整个服务器实现socketio的情况下进行聊天吗?

Javascript 我可以在不向整个服务器实现socketio的情况下进行聊天吗?,javascript,node.js,chat,Javascript,Node.js,Chat,我现在有一个使用express的网站,非常好用,我有一堆router.get和post。我还使用mongodb,因此可以使用req.user.username访问用户的用户名 现在,我想在不必为整个服务器实现socketio的情况下进行聊天。我只是不需要在不需要的时候运行socketio,只需要在有聊天功能的页面上运行 我目前的想法是这样的:每当用户发出“getChat”请求时,我都将聊天作为JSON对象发送给他们。然后在初始聊天渲染之后,我让用户调用一个“waitChat”请求。当其他人发出p

我现在有一个使用express的网站,非常好用,我有一堆router.get和post。我还使用mongodb,因此可以使用req.user.username访问用户的用户名

现在,我想在不必为整个服务器实现socketio的情况下进行聊天。我只是不需要在不需要的时候运行socketio,只需要在有聊天功能的页面上运行

我目前的想法是这样的:每当用户发出“getChat”请求时,我都将聊天作为JSON对象发送给他们。然后在初始聊天渲染之后,我让用户调用一个“waitChat”请求。当其他人发出post请求发送消息时,我将在“waitChat”get请求中重新发送聊天,或者让waitChat重新发送“success”消息,然后让用户发出另一个“getChat”请求,这将是一个无休止的循环

现在,我想在不必为整个服务器实现socketio的情况下进行聊天

不,你不能那样做。您的服务器根本不知道您的某个网页何时可能尝试连接到您的聊天服务器。你需要一直倾听

此外,您似乎对侦听传入的socket.io连接的含义有误解,因为没有连接的侦听服务器不做任何事情,也不花费任何费用。所以,“一直跑步”毫无意义。事实上,启动服务器、停止服务器、稍后再次启动服务器等都会增加成本。。。而不是听其自然。另外,您的措辞“不必为我的整个服务器实现socketio”听起来也像是您认为仅仅拥有一个侦听socket.io服务器就很重要。这根本不是一个重量级的概念

此外,让你的socket.io服务器一直监听也绝对没有坏处。如果要通过先前设置的cookie或其他某种身份验证方法对传入的socket.io连接进行身份验证,则可以实现身份验证,以便只有授权用户才能连接


我不太明白你所说的waitChat和getChat。聊天背后的想法是,userA可以发送一条消息,该消息将被传递给userB。其工作原理是,userA向服务器发送一条消息,然后服务器将其传递给userB

显然,userA很容易向服务器发送消息。这可以通过多种方式实现。问题是服务器如何将消息传递给userB。我想你知道,服务器不能直接联系userB。方法如下:

  • userB定期轮询服务器以请求新的内容
  • userB使用“长轮询”,也就是轮询,但这是一个专门的版本,其中服务器保留轮询请求一段时间,然后在有数据或超时时返回,然后客户端必须再次轮询
  • userB与服务器建立持久的webSocket或socket.io连接,然后服务器可以随时通过该连接向客户端发送数据

  • webSocket或socket.io连接是迄今为止最有效的连接,事实上,整个概念都是发明出来并添加到浏览器中的,因为这两种轮询方案不是非常有效或可扩展的。

    基本上,您需要客户端和服务器之间的连接,而不是需要“推送/广播”的“东西”将您的消息发送给已连接的客户端。“某物”是“套接字”,是客户端和服务器之间的活动连接。无论您在第二部分中说了什么,基本上都是“socket”的实现,您已经有了一个框架
    socket.io
    ,所以请使用它。好吧,我想我会使用socketio来实现这一点,但是当用户与socketio连接时,我如何获取用户的用户名呢?问题不是我不喜欢socketio,而是我不知道如何组合我当前的express设置,而且对于每个套接字连接,都有一个id分配给它,你必须维护哪个用户使用哪个id连接。有很多可用的示例,express中的google chat示例和socket io。好的,所以我想我会使用socketio来实现这一点,但是当用户连接到socketio时,我如何获得用户的用户名呢?问题不是我不喜欢socketio,而是我不知道如何结合当前的express设置,以及it@anduyang-当socket.io连接连接时,Cookie可用。因此,对于socket.io连接,您将以同样的方式知道使用http请求的用户是谁。事实上,socket.io连接从http请求开始(这就是cookie可用的原因)。