前端webSocket和后台php
HTTP协议的特性:属于“请求-响应”模型,只有客户端发起了请求消息,服务器才能给出响应消息,没有请求,就没有响应;一个请求消息,服务器只能返回一个响应消息。有些特殊应用场景中,如“在线股票”、“聊天室”等,需要模拟呈现出“客户端不发请求,服务器也在不停的给出响应”效果,若使用HTTP协议,只能使用“AJAX+定时器”来近似的实现——心跳请求,问题:心跳过慢则信息的实效性差,心跳过快则服务器压力太大!
WebSocket协议的特性:属于“广播-收听”模型,只要客户端连接到服务器上,就不再断开(永久连接),一方可以不停的给对方发消息,对方可以不给出响应。使用WS协议代替心跳请求,可以非常好的解决HTTP协议在某些应用中的不足。WS协议的服务器也有不足:永久连接限制了客户端的数量。
WebSocket应用程序必需两个程序:
WS服务器端程序:
(1)、可以使用Java、PHP、C#、Node.js编写,修改PHP解释器配置文件(php.ini)来启用socket相关函数:extension=php_sockets.dll 去掉此行前的分号(此例子采用xampp本地服务) 重启本地服务(记得配置xampp的php变量环境,不懂百度)
(2)、在xampp\\htdocs 下新建一个文件websocket,里面新建两个文件如下:
socket_client.html
socket_server.php
socket_client.html文件代码如下:
- <!DOCTYPE html>
- <html>
- <head lang="en">
- <meta charset="UTF-8">
- <title></title>
- </head>
- <body>
- <h3>WebSocket协议的客户端程序</h3>
- <button id="btConnect">连接到WS服务器</button>
- <button id="btSendAndReceive">向WS服务器发消息并接收消息</button>
- <button id="btClose">断开与WS服务器的连接</button>
- <div id="val"></div>
- <script>
- var wsClient = null; //WS客户端对象
- btConnect.onclick = function(){
- //连接到WS服务器,注意:协议名不是http!
- wsClient = new WebSocket('ws://127.0.0.1:9999');
- wsClient.onopen = function(){
- console.log('WS客户端已经成功连接到服务器上')
- }
- }
- btSendAndReceive.onclick = function(){
- //向WS服务器发送一个消息
- wsClient.send('Hello Server');
- //接收WS服务器返回的消息
- wsClient.onmessage = function(e){
- console.log('WS客户端接收到一个服务器的消息:'+ e.data);
- val.innerHTML=e.data;
- }
- }
- btClose.onclick = function(){
- //断开到WS服务器的连接
- wsClient.close(); //向服务器发消息,主动断开连接
- wsClient.onclose = function(){
- //经过客户端和服务器的四次挥手后,二者的连接断开了
- console.log('到服务器的连接已经断开')
- }
- }
- </script>
- </body>
- </html>
socket_server.php代码如下:
- <?php
- $address = "127.0.0.1";
- $port = 9999; //调试的时候,可以多换端口来测试程序!
- set_time_limit(0);
- $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
- socket_set_block($sock);
- socket_bind($sock, $address, $port);
- socket_listen($sock, 4);
- do
- {
- echo "Waiting for Connection...\n";
- $msgsock = socket_accept($sock);
- echo "Waiting for Request...\n";
- $buf = socket_read($msgsock, 8192); //读取请求
- echo "Request Received: $buf\n";
- $response = hand_shake($buf);
- socket_write($msgsock,$response,strlen($response)); //发送响应
- //正式开始通信...
- $buf = socket_read($msgsock, 8192);
- for($i=0; $i<3; $i++){
- $msg = "WELCOME $i\n";
- $msg = code($msg);
- sleep(1);
- socket_write($msgsock, $msg, strlen($msg));
- }
- socket_close($msgsock);
- } while (true);
- socket_close($sock);
- function hand_shake($buf){
- $buf = substr($buf,strpos($buf,'Sec-WebSocket-Key:')+18);
- $key = trim(substr($buf,0,strpos($buf,"\r\n")));
- $new_key = base64_encode(sha1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true));
- $new_message = "HTTP/1.1 101 Switching Protocols\r\n";
- $new_message .= "Upgrade: websocket\r\n";
- $new_message .= "Sec-WebSocket-Version: 13\r\n";
- $new_message .= "Connection: Upgrade\r\n";
- $new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n";
- return $new_message;
- }
- function code($msg){
- $msg = preg_replace(array('/\r$/','/\n$/','/\r\n$/',), '', $msg);
- $frame = array();
- $frame[0] = '81';
- $len = strlen($msg);
- $frame[1] = $len<16?'0'.dechex($len):dechex($len);
- $frame[2] = ord_hex($msg);
- $data = implode('',$frame);
- return pack("H*", $data);
- }
- function ord_hex($data) {
- $msg = '';
- $l = strlen($data);
- for ($i= 0; $i<$l; $i++) {
- $msg .= dechex(ord($data{$i}));
- }
- return $msg;
- }
(3)、进入文件夹(xampp\htdocs\websocket)按住Shift +右键,(选择在此处打开令行窗口)执行调用PHP解释器,执行PHP语言编写的Socket服务器程序,输入如下代码:
php socket_server.php
运行完显示如下信息代表连接成功
(4)、访问socket_client.html (http://127.0.0.1/websocket/socket_client.html) 需要服务访问,点击按钮“连接到ws服务器”控制台上(console.log)能看到如下
点击按钮“向WS服务器发消息并接收消息”就能看到如下
这时就可以将信息填入html 标签上 就实现了 时时更新了
前端webSocket和后台php的更多相关文章
- 微信小程序----关于变量对象data 和 前端wxml取后台js变量值
(一)页面变量对象data 对象data 有两个方面用途 第一,前端wxml的数据渲染是通过设置此对象中定义的变量进行关联展现的 第二,定义JS页面中的页面局部变量,使其整个页面中可使用或调用 对象d ...
- android支付宝app支付(原生态)-包括android前端与java后台
本文讲解了 android开发的原生态app集成了支付宝支付, 还提供了java后台服务器处理支付宝支付的加密代码, app前端与java后台服务器使用json数据格式交互信息,java后台服务主要用 ...
- android 集成支付宝app支付(原生态)-包括android前端与java后台
本文讲解了 android开发的原生态app集成了支付宝支付, 还提供了java后台服务器处理支付宝支付的加密代码, app前端与java后台服务器使用json数据格式交互信息,java后台服务主要用 ...
- SpringBoot集成websocket发送后台日志到前台页面
业务需求 后台为一个采集系统,需要将采集过程中产生的日志实时发送到前台页面展示,以便了解采集过程. 技能点 SpringBoot 2.x websocket logback thymeleaf Rab ...
- 跨域问题,前端主动向后台发送cookie
跨域是什么? 从一个域名的网页访问另一个域名的资源,就会出现跨域.只要协议.端口.域名有一个不同就会出现跨域 例如: 1.协议不同 http://www.baidu.com:80 和 https:/ ...
- Android前端人员与后台开发的撕逼(一)
首先表明一下身份,本人是Android前端开发人员,本篇只做合理性探讨,不进行人身攻击: 其次希望各位大神进行点评!点评!点评! 我们讨论一下接口的两种返回方式,直接举例说明一下,假设书籍信息表有30 ...
- [转]为什么大型网站前端使用 PHP 后台逻辑用 Java?
最近纠结了一下,如果开发一个大型的网站,我到底应该使用php还是jsp,后台到底使用php还是用java,我的选择要么是php要么是java,因为我喜欢linux.unix,当然window平台也必须 ...
- vue-cli 前端开发,后台接口跨域代理调试问题
使用 webpack的方式开发的时候,前台开发过程中需要调用很多后台的数据接口,但是通常前后台分离的开发方式,后台的接口数据很可能是不方便或者是不能在前端同学的电脑上运行的,也就出现了所谓的跨域问题. ...
- 前端js,后台python实现RSA非对称加密
先熟悉使用 在后台使用RSA实现秘钥生产,加密,解密; # -*- encoding:utf-8 -*- import base64 from Crypto import Random from Cr ...
随机推荐
- 可变参数以及stdcall
void event_warnx(const char *fmt, ...) EV_CHECK_FMT(1,2); #define EV_CHECK_FMT(a,b) __attribute__((f ...
- EF Core 一、重识 EF
重识EF EF Core 学习资料:https://docs.microsoft.com/zh-cn/ef/core/dbcontext-configuration/ 本为作为EF Core学习的开始 ...
- Ceph如何实现文件系统的横向扩展
前言 在跟一个朋友聊天的时候,聊到一个技术问题,他们的一个环境上面小文件巨多,是我目前知道的集群里面规模算非常大的了,但是目前有个问题,一方面会进行一倍的硬件的扩容,而文件的数量也在剧烈的增长着,所以 ...
- Vue 组件化开发之插槽
插槽的作用 相信看过前一篇组件化开发后,你对组件化开发有了新的认识. 插槽是干什么的呢?它其实是配合组件一起使用的,让一个组件能够更加的灵活多变,如下图所示,你可以将组件当作一块电脑主板,将插槽当作主 ...
- 【原创】Linux虚拟化KVM-Qemu分析(六)之中断虚拟化
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: KVM版本:5.9 ...
- 深度分析:SpringBoot异常捕获与封装处理,看完你学会了吗?
SpringBoot异常处理 简介 日常开发过程中,难免有的程序会因为某些原因抛出异常,而这些异常一般都是利用try ,catch的方式处理异常或者throw,throws的方式抛出异常不管.这种 ...
- 使用Mac清理工具CleanMyMac对Mac电脑进行维护
CleanMyMac是Mac系统下的一款苹果电脑清理软件,同时也是一款优秀的电脑维护软件,它能通过用户手动运行CleanMyMac内置脚本文件,释放电脑内存,帮助电脑缓解卡顿现象,保证电脑的良好持续运 ...
- 【应用服务 App Service】解决无法从Azure门户SSH登录问题
问题描述 中国区的Azure App Service(应用服务)已经支持创建Docker并选择Linux环境.在使用中,我们可以继续通过kudu站点的方式登录查看站点的一些日志及部署文件.它的登录方式 ...
- C++基础知识篇:C++ 运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C++ 内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 本章将逐一介绍算术运 ...
- 使C语言实现面向对象的三个要素,你掌握了吗?