要实现消息互通就必须要让这些消息服务器本身能互通,想了两个方式,一种是消息服务器之间交叉链接,另一种是增加一个特殊的消息服务器,这个消息服务器不对外开放,只负责消息转发和推送。
下列测试不考虑防火墙等。仅测试可行性和效率。
消息服务器
转发服务器
公共缓存
软件环境
client1 可向 client2 或者其他 client 发送消息,并接收其他 client 发送的消息.
Redis 中保存 client 连接的信息,给每个用户分配唯一的 key ,包括链接的哪台服务器,转发服务器定时检测消息服务器,如消息服务器挂掉,由转发服务器清理掉Redis已经挂掉的所有链接。
1. Client1 给 Client2 发送一条消息
2. Socket1 接收到消息,根据 key从Redis 取出 Client2 的连接信息,连接在本机,直接推送给 Client2 ,流程结束。
3.如果连接不在本机,把消息推送到转发服务器,由转发服务器把该消息推送给连接所在消息服务器,消息服务器接收消息,推送给 Client2 。
服务器上创建一个server.php,内容如下:
上只需把ip变更一下即可。192.168.0.201变更为192.168.0.202.
在转发服务器上建立脚本proxy.php,内容如下:
注意开启顺序
1.开启转发服务器php proxy.php
2.分别开启socket服务器php server.php
可以在转发服务器上看到两个消息服务器已经连接
3.开始测试,分别打开两个telnet,连接两个消息服务器,发送消息测试:
登陆
基于强大的 swoole 扩展,让php高效的实现这些成为可能,目前消息服务器到转发服务器是长连接,转发服务器到消息服务器是短连接,存在性能瓶颈,也浪费了连接资源。下一步改造成长连接,消息服务器的client使用异步。
WebSocket协议是基于TCP的一种新的网络协议。他实现了浏览器与服务器全双工通信—允许服务器主动发送信息给客户端。
建立在TCP协议之上
性能开销小性能高效
客户端可以与任意服务器通信
协议标识符号 ws wss
持久化网络通信协议
WebSocket服务器是建立在Http服务器之上的长连接服务器,客户端首先会发送一个Http的请求与服务器进行握手。握手成功后会触发onOpen事件,表示连接已就绪,onOpen函数中可以得到$request对象,包含了Http握手的相关信息,如GET参数、Cookie、Http头信息等。
建立连接后客户端与服务器端就可以双向通信了。
客户端向服务器端发送信息时,服务器端触发onMessage事件回调
服务器端可以调用$server->push()向某个客户端(使用$fd标识符)发送消息
服务器端可以设置onHandShake事件回调来手工处理WebSocket握手
swoole_http_server是swoole_server的子类,内置了Http的支持
swoole_websocket_server是swoole_http_server的子类, 内置了WebSocket的支持。
WebSocket\Server 继承自 Http\Server
设置了onRequest回调,WebSocket\Server也可以同时作为http服务器
未设置onRequest回调,WebSocket\Server收到http请求后会返回http 400错误页面
如果想通过接收http触发所有websocket的推送,需要注意作用域的问题,面向过程请使用global对WebSocket\Server进行引用,面向对象可以把WebSocket\Server设置成一个成员属性
创建ws_client.html
1、通过httpserver来开启:分别执行swoole-http服务、websocket服务文件启动服务,浏览器访问 http://127.0.0.1:8811/ws_client.html ,注意这里请求的是8811端口,即httpserver中配置的端口,在控制台中查看效果。同时可在浏览器开启多个会话,查看多个连接效果。
2、通过websocket-server来开启加载:
在websocket-server中添加配置
此时关闭http-server、websocket-server,并重启websocket-server,不再重启http-server,使用8812端口在浏览器访问 http://127.0.0.1:8812/ws_client.html ,同样成功。
代理服务所起的是一个桥的作用,它是网络信息的中转站。在网络中应用代理服务一般是基于以下几个原因:1充分利用IP地址资源。在局域网中,一般对外的IP地址都是非常有限的,为了保证局域网内部的主机都能够访问互联网资源,通过网络代理就可以实现。2能够保证网络安全。网络代理可以充当内部网和互联网之间的防火墙,通过过滤IP地址,限定某些IP地址对外部资源的访问。3能够有效地隐藏自己的IP地址和主机名。由于所有对外网的请求都是通过代理服务器实现的,所以目的主机只能知道代理服务器的IP地址。4提高网络速度。通常代理服务器都设有一个较大的硬盘缓冲区,它存储界数据,当你再访问相同的数据时,则可以直接从缓冲区中取出信息,从而提高访问速度。一般都用的是小鸟云服务器,稳定性以及速度很快感觉挺好的。欢迎分享,转载请注明来源:夏雨云
评论列表(0条)