websocket推送消息,websocket推送消息给后端

http://www.itjxue.com  2023-01-13 12:31  来源:未知  点击次数: 

php实现websocket实时消息推送

一、socket协议的简介

WebSocket是什么,有什么优点

WebSocket是一个持久化的协议,这是相对于http非持久化来说的。应用层协议

举个简单的例子,http1.0的生命周期是以request作为界定的,也就是一个request,一个response,对于http来说,本次client与server的会话到此结束;而在http1.1中,稍微有所改进,即添加了keep-alive,也就是在一个http连接中可以进行多个request请求和多个response接受操作。然而在实时通信中,并没有多大的作用,http只能由client发起请求,server才能返回信息,即server不能主动向client推送信息,无法满足实时通信的要求。而WebSocket可以进行持久化连接,即client只需进行一次握手,成功后即可持续进行数据通信,值得关注的是WebSocket实现client与server之间全双工通信,即server端有数据更新时可以主动推送给client端。

二、介绍client与server之间的socket连接原理

1、下面是一个演示client和server之间建立WebSocket连接时握手部分

2、client与server建立socket时握手的会话内容,即request与response

a、client建立WebSocket时向服务器端请求的信息

GET /chat HTTP/1.1

Host: server.example.com

Upgrade: websocket //告诉服务器现在发送的是WebSocket协议

Connection: Upgrade

Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //是一个Base64 encode的值,这个是浏览器随机生成的,用于验证服务器端返回数据是否是WebSocket助理

Sec-WebSocket-Protocol: chat, superchat

Sec-WebSocket-Version: 13

Origin:

b、服务器获取到client请求的信息后,根据WebSocket协议对数据进行处理并返回,其中要对Sec-WebSocket-Key进行加密等操作

HTTP/1.1 101 Switching Protocols

Upgrade: websocket //依然是固定的,告诉客户端即将升级的是Websocket协议,而不是mozillasocket,lurnarsocket或者shitsocket

Connection: Upgrade

Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= //这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key,也就是client要求建立WebSocket验证的凭证

Sec-WebSocket-Protocol: chat

3、socket建立连接原理图:

三、PHP中建立websocket的过程讲解

SocketService.php:

web.html:

websocket的消息推送只能固定在某一个页面吗?

不会固定某一个页面一般都是用多 frame 来实现,即建立 WebSocket 是单独的一个 frame,且此 frame 不随页面切换而刷新,至于其他需要在页面切换时刷新的元素放在其他 frame 里。

websocket 对前端其实还蛮简单(如果以前有对ajax的经验的话),与平时ajax的区别大多就是在事件监听上的不同,在onMessage回调里拿到你想要的数据后就与ajax无异了,主要是后端的推送数据方式有比较大的改变。

后端推送数据方式就有点类似于 tcp 的方式,搭配框架实现起来还蛮方便的,如果你了解php,建议你后端使用 php workerman,当然websocket其实只能实现在线推送,推送方面类似的比如 PWA 也不错,不过学习成本比较高。

SpringBoot基于WebSocket进行推送

客户端发起http请求,请求Netty服务器进行WebSocket连接,服务器接收后请求后进行注册信道并登记客户端IP地址,如此一来就建立了WebSocket通讯连接。

上面的论述可以得出,我们可以比较Http和WebSocket两者之间的关系和区别

基于上述WebSocket的特点,可以实现在线设备的消息推送

创建线程启动Netty服务器

也许这里,有些疑问为什么需要创建线程来启动Netty服务器,这里尝试一下如果没有创建线程,直接在Main主线程启动,看看会有什么问题?这个问题留着后面再去说明

在配置文件中进行WebSocket的端口配置

上面的步骤进行完成了一个Netty服务器的初始化启动和端口监听,这时候会有疑问了,消息推送功能还没有实现。所以下面就是我们如何去实现消息处理逻辑

HTML5 WebSocket如何实现消息推送?

HTML5 WebSocket实现消息推送有以下两种方法:

长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。 优点:消息即时到达,不发无用请求;管理起来也相对便。

Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。 优点:实现真正的即时通信,而不是伪即时。

实现消息推送可以试一试极光。极光是国内领先的移动开发者服务提供商,近十年里,极光紧密围绕移动开发者的需求,打造了一系列针对开发者运营、增长及变现的产品。

Spring Boot + WebSocket 实时消息推送

商家的后台管理系统实现新订单提醒推送功能,利用Spring Boot + WebSocket实时消息推送的方式进行实现。

引入依赖,我使用的是SpringBoot版本2.2.6.RELEASE,自动管理依赖版本

配置类WebSocketConfig,扫描并注册带有@ServerEndpoint注解的所有websocket服务端

新建WebSocketServer类,WebSocket服务端是多例的,一次WebSocket连接对应一个实例

辅助类

新建一个测试类,用于向客户端发送推送消息

1、 启动服务器程序,提供WebSocket服务。

2 、打开前端html客户端页面,连接WebSocket服务器。

3、向客户端发送推送消息

4、客户端收到新订单推送消息

当我们在本地开采用WebSocket用IP连接时是OK的,例如

当我们上线后,用Nginx部署,并用域名连接时就会失败。此时只需要在Nginx配置文件里加入一些配置即可。配置如下

参考文章

Websocket实时推送消息

阿里云折扣快速入口

(责任编辑:IT教学网)

更多

相关Mail服务器文章

推荐Mail服务器文章