HTML5_07之WebSocket

时间:2023-02-27 07:46:08

1、HTML5新特性之WebSocket:
 ①HTTP协议的不足:基于“请求——响应”模型,只有在客户端发送请求后,服务器才会给予响应;对于实时的股票走势图,以及聊天通讯等无法满足需求;
 ②解决方案:setInterval+AJAX:心跳请求;
  问题:过于频繁对服务器压力过大,频率过低则信息获取延迟;
 ③最佳解决方案——WebSocket协议:
  基于“广播——收听”模型,客户端连接到服务器后不再断开,服务器有了消息随时发送给客户端,客户端也可以不停地给服务器发送消息;
  不足:客户端和服务器是永久连接,服务器端可容纳的连接数是有限的;
 ④WebSocket应用需要服务器端和客户端都使用WebSocket协议;
 ⑤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<5; $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;

}

HTML5_07之WebSocket的更多相关文章

  1. 漫扯&colon;从polling到Websocket

    Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response.这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息... 轮询 老大发火了,小弟们自 ...

  2. 细说WebSocket - Node篇

    在上一篇提高到了 web 通信的各种方式,包括 轮询.长连接 以及各种 HTML5 中提到的手段.本文将详细描述 WebSocket协议 在 web通讯 中的实现. 一.WebSocket 协议 1. ...

  3. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  4. WebSocket - &lpar; 一&period;概述 &rpar;

    说到 WebSocket,不得不提 HTML5,作为近年来Web技术领域最大的改进与变化,包含CSS3.离线与存储.多媒体.连接性( Connectivity )等一系列领域,而即将介绍的 WebSo ...

  5. php&plus;websocket搭建简易聊天室实践

    1.前言 公司游戏里面有个简单的聊天室,了解了之后才知道是node+websocket做的,想想php也来做个简单的聊天室.于是搜集各种资料看文档.找实例自己也写了个简单的聊天室. http连接分为短 ...

  6. Demo源码放送:打通B&sol;S与C&sol;S !让HTML5 WebSocket与&period;NET Socket公用同一个服务端!

    随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信.如 ...

  7. Cowboy 开源 WebSocket 网络库

    Cowboy.WebSockets 是一个托管在 GitHub 上的基于 .NET/C# 实现的开源 WebSocket 网络库,其完整的实现了 RFC 6455 (The WebSocket Pro ...

  8. 借助Nodejs探究WebSocket

    文章导读: 一.概述-what's WebSocket? 二.运行在浏览器中的WebSocket客户端+使用ws模块搭建的简单服务器 三.Node中的WebSocket 四.socket.io 五.扩 ...

  9. 细说websocket - php篇

    下面我画了一个图演示 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket ...

随机推荐

  1. nginx &dollar;document&lowbar;uri 防止死循环

    $document_uri 表示访问的url 现在我的需求是,访问 www.xxx.com 请求到 www.xxx.com/bbs/ 在nginx配置文件中加入 if ($document_uri ! ...

  2. sis9280触摸ic 基于rk3288 的安卓4&period;4的 多点触摸

    前言:sis提供的驱动ic.基于rk3288的安卓系统.亲眼看到人家完成一次移植.很激动的记下一些东西..虽然我看不懂.其实现在的工作也不需要看懂.叫人协助就好,只需要知道有这个东西. 1linux下 ...

  3. ubuntu不能登录图形用户界面,游客身份可登陆,命令行可登陆

    ubuntu是13.04版本,我猜其他的版本解决办法大概也一样.当开机进入登陆界面后我们输入密码后并没有进入应该进入的图形用户界面,而是进入一个命令行界面并且一闪而过又回到了登录界面,而已游客的身份却 ...

  4. Linux manual中命令标号的含义

    如果查看Linux manual(例如,执行:man open), 会发现文档中有这样的表达方式:read(2), write(2), lseek(2), fcntl(2)等,括号中的数值表达什么含义 ...

  5. slot的含义

    1) slot就是槽的意思,是一个资源单位,只有给task分配了一个slot之后,这个task才可以运行.slot分两种,map slot沪蓉reduce slot.另外,slot是一个逻辑概念,一个 ...

  6. arm-linux-gcc编译器测试

    1.#include <>与#include ""的区别 #include <>只在标准库中搜索头文件,而#include ""首先在用 ...

  7. 国内BI工具&sol;报表工具厂商简介

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  8. Spring入门实例

    Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. 控制反转:应 ...

  9. iOS 动态调用方法

      - (void)bugly { dispatch_async(dispatch_get_global_queue(0, 0), ^{ if (NSClassFromString(@"Bu ...

  10. Java泛型详解&lpar;转&rpar;

    文章转自  importNew:Java 泛型详解 引言 泛型是Java中一个非常重要的知识点,在Java集合类框架中泛型被广泛应用.本文我们将从零开始来看一下Java泛型的设计,将会涉及到通配符处理 ...