如何通知客户端浏览器服务器上的某个事件?

4 投票
1 回答
1906 浏览
提问于 2025-04-17 06:41

我在服务器端使用Python(Tornado),在客户端使用一些JavaScript。我遇到了一个常见的情况——一个用户给另一个用户发送消息。我想让服务器通知接收消息的客户端浏览器有新消息。请问我该怎么做?我需要和客户端建立一个长连接(可能用websocket)还是其他什么方法呢?

补充说明: 为了通过websocket建立连接,我找到了一款不错的库TornadIO

再补充一下: 由于项目的负载很高,和每个客户端建立连接看起来有点可疑。我担心会出现c10k问题。也许这只是我知识的不足。

1 个回答

2

我在服务器端使用Python(Tornado),在客户端使用一些JavaScript。我遇到了一个常见的情况——一个用户给另一个用户发送消息。我想让服务器通知接收消息的客户端浏览器有新消息。请问我该怎么做?我需要和客户端建立一个长连接(可能用websocket)还是其他什么方法?

使用像Tornado这样的实时网络服务器是可以的。TornadIO看起来是个不错的解决方案,因为它会使用socket.io,这样可以兼容一些老旧的浏览器。

关于C10K问题的维基百科条目提供了一些已经解决这个问题的服务器列表:

有几个网络服务器被开发出来以应对C10K问题:

  • nginx,它依靠事件驱动(异步)架构来处理请求,而不是使用线程(WordPress.com就是用nginx来解决C10K问题的)
  • Lighttpd,它也依靠异步架构来处理请求
  • Cherokee,一个轻量级的网络服务器
  • Tornado,一个用Python写的非阻塞网络服务器和网络应用框架
  • Apache Deft,一个在JVM上运行的异步非阻塞网络服务器
  • JBoss Netty,一个NIO客户端服务器框架,可以快速轻松地开发网络应用,比如协议服务器和客户端
  • Node.js,一个在谷歌的V8 JavaScript引擎上运行的异步非阻塞网络服务器
  • EventMachine,一个在Ruby EventMachine上运行的异步非阻塞网络服务器
  • Yaws,一个用Erlang写的网络服务器,利用了Erlang极其轻量级的进程
  • Medusa,一个用Python写的非阻塞网络服务器库

你会发现,Tornado在这个列表中。

除此之外,你的问题可能更多的是关于水平扩展

,而不是如何实现服务器到客户端的通知。

根据你选择的实时服务器解决方案,这可能永远不会成为问题。例如,Caplin System的Liberator单实例可以支持超过10,000个持久连接。

撰写回答