websocket怎么主动从服务端发送信息

我在网上看了很多聊天室的应用, 但是基本都是在客户端出发一些操作的时候(比如客户端push信息到服务端时), 服务端进行一些处理, 然后再push给某些客户端. 这些现在我也都实现了.

我的问题是, 我怎么从服务端主动发送一个push给某些用户, (比如服务端新发布了一个文章).

我现在服务端用的php, swoole. 这个服务启动后, 在监听客户端的时候, 怎么再监听一些其他的呢? (比方说mq? 有新东西就调用socket的push?); 或者说我做其他服务端操作的时候? 我能获取到websocket服务? 然后push?

这点始终想不明白, 望大神指点.

阅读 10.1k
5 个回答

websocket属于CS模型(客户端-服务端)模型,客户端可以是Javascript中new Websocket来创建client,也可以是PHP的中的创建socket来创建client。

对应于你的问题,只需要写个PHP的websocket client即可,swoole example中提供了这样的client

然后mq有新东西了就调用此client向websocket server发一些特殊的消息(可以包含接收方信息,内容等信息),websocket server收到消息时肯定能得到当前server的实例,再结合者收到的消息就可解决你的问题。

我以前用过轮询,不知道适不适合你

服务端也可以作为客户端。
之前恰好也用到过socket通信的实例,服务端上用curl推送给服务端上的socket服务,然后客户端监听服务端的socket端口,这样服务端一有数据变动,客户端就能监听到。
大概就是这样。

1、php-fpm是无法主动push消息给客户的。

2、因为swoole是非阻塞模型,所以多开几个服务端socket就可以监听其他端口了。

3、websocket不是一个服务(是协议)。可以看做是一个长连接的HTTP,所以只要拿到与客户端通信的socket然后按照websocket的协议格式写socket就可以了。

新手上路,请多包涵

您好,我也遇到相应的问题,(我的服务器是swoole-websocket,现在也有个需求是需要服务端做主动推送),查了好多文档,都没有相应的方案。当我发现您的博文,让人眼前一亮。 您应该是解决了那个问题了吧。能不能给我提供个demo.将不胜感激!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题