当前位置: 代码迷 >> 综合 >> swoole 点对点发送消息推送
  详细解决方案

swoole 点对点发送消息推送

热度:18   发布时间:2023-11-26 21:09:56.0

swoole+webSocket  消息推送,或则聊天室,实现。

先上代码,(上菜。。。。)点对点,简单(客户发送,服务回复。)

点对所有,广播

见图所示:参数详解

 

/*** 1.实例化  对象* $host  127.0.0.1 (本机)   外网:0.0.0.0 (ipv4的所有可访问)* $port  9501 (1024以下 需要root权限)* $mode  运行模式    1.SWOOLE_PROCESS  多进程模式(默认)  2.SWOOLE_BASE  基本模式    (可选)* $sock_type 指定Socket的类型,支持TCP、UDP、TCP6、UDP6、UnixSocket Stream/Dgram 6种  (可选)*/
// 注:【on 】和jquery类似
采用匿名函数   $ws ,$fd   两个形参   :$ws对象    $fd  客户端标识符(用户id)

着重 注意:$fd,这是基于TCP的客户端的唯一标识。在swoole官方文档中,韩老大已经写的很清楚了,

这个$fd,

1.自增的

2.有限(max:1600万)

3.可复用(但同一个server中,不会重复)

(番外鱼:有的人认为,有最大值,且可复用,这样会限制服务。并且崇洋媚外,殊不知Linux最大支持连接数是64K,几位65535,可ulimit 调参,如果自己基于swoole写的服务,真的达到了同时在线人数1600w+,并且单服务器。那么,什么话都别说,膜拜)

思考:服务怎么和实际业务完美的结合,绑定,映射实现。

途径:DB,redis,memcache,apc,等等。

1.当客户端发来请求,并携带uid,或用户名等(业务中的唯一标识)

2.建立连接时,存入              绑定,产生映射关系。   $fd1 ==   uid10086         $fd2 ==   uid10010

3.业务处理,点对点发送,客户端传来。想要发送给B,B的uid,同时uid_B发来  ,此时查找当前的uid_B的映射$fd,然后发送。

                    点对多,同样,从映射中获取,并遍历,$server->push($fd,“我是谁谁,我想告诉你们”);

4.何时取消映射关系?何时取消可以保证复用的时候,关系没有错乱?

当然是在关闭的时候取消当前的映射关系,以防止在复用的时候导致关系的错乱。

 

以上仅为大概思路,具体操作当中,还要考虑到心跳检测,以防止客户端断电,等意外因素。

心跳检测的思路:

方法1.客户端在固定的时间间隔中发送请求,后台服务判断,某个$fd,在超出时间间隔范围外,仍没有给我汇报,则宣布死亡

方法2.服务端主动打发送信息,客户端可返回信息,可不返回信息。

         A,客户端返回信息,此时后端接收到信息,知道该连接还活着。

         B,傲娇的客户端不返回信息,后端仍然孜孜不倦的发送,直到客户端已经关闭,此时服务端发送的消息会在tcp层,因为发送超时,而关闭。

php的发展,在突破自身瓶颈之后,不在是web小王子,而是可以百变金刚。phper在不止步于业务层面上更进一步,相反,phper能实现更多的业务需求。

 

我为人人,人人为我;美美与共,天下大同;