手机版

基于Swoole的PHP和websocket聊天室的实现

时间:2021-09-08 来源:互联网 编辑:宝哥软件园 浏览:

websocket

Websocket只是一个网络通信协议

就像http、ftp等。都是网络通信协议;不要想太多;

与HTTP这种非持久协议相比,Websocket是一种持久的网络通信协议。

网络套接字和HTTP的关系

有交集,但不是全部。

Websocket只是借用了HTTP协议的一部分来完成一次握手。(HTTP的三次握手,这里只完成一次)

http和websocket请求头的比较:

http:

原本客户端通过http(骑马)用信件请求服务器,服务器处理请求(写回复)再通过http(骑马)返回;链接断开;

WebSocket:

一个客户端通过http(骑马)向服务器请求一封信,但同时它携带了Upgrade:websocket和Connection:Upgrade(两个管道)。如果服务器支持WebSocket协议(带有两个管道的接口),它就使用Websocket协议返回可用信息(丢弃马匹)。之后,两个管道都用于信息传输,除非一方人为切断管道;如果服务器不支持,客户端请求链接失败并返回错误消息;

http和websocket响应头的比较:

websocket和ajax轮询与长轮询的区别

首先是ajax轮询。ajax轮询的原理非常简单。让浏览器每隔几秒钟发送一个请求,询问服务器是否有新信息

场景再现:

客户:啦啦啦,有什么新消息吗(请求)

服务器端:否(响应)

客户:啦啦啦,有什么新消息吗(请求)

服务器:没有。(回应)

客户:啦啦啦,有什么新消息吗(请求)

服务员:你太生气了,没有。(回应)

客户:啦啦啦,有新消息吗(请求)

服务员:好的,好的,给你。(回应)

客户:啦啦啦,有新消息吗(请求)

服务器端:没有。没有。没有

其实长轮询的原理类似于ajax轮询,采用轮询方式,不做讨论;

从上面可以看出,轮询实际上就是不断建立HTTP连接,然后等待服务器处理,这可以体现HTTP协议的另一个特点,被动性。同时,http的每次请求和响应后,服务器都丢弃所有的客户端信息,下一个请求必须携带身份信息(cookie),这是无状态的;

Websocket的出现干净利落地解决了这些问题。

因此,上述场景可以修改如下。

客户端:啦啦啦,我想建立Websocket协议,所需服务:聊天,Websocket协议版本:17(HTTP Request)

服务器:好的,确认它已经升级到网络套接字协议(HTTP协议交换)

客户:有信息请推给我。

服务员:好的,我有时会告诉你。

客户:巴拉布开始为阿拉巴拉而战

服务器:Aoi sora ala

客户:流鼻血,我擦.

服务器端:哈哈普尔教育很牛逼。哈哈哈哈

服务器:笑死我了,哈哈

Swoole

然而,为了用PHP和HTML5完成一个WebSocket请求和响应,我走过了千山万水,在丛林深处找到了Swoole :

PHP语言的异步、并行、高性能的网络通信框架用纯C语言编写,提供异步多线程服务器、异步TCP/UDP网络客户端、异步MySQL、数据库连接池、AsyncTask、消息队列、毫秒定时器、异步文件读写、异步DNS查询。

支持的服务:

HttpServer

网络套接字服务器

传输控制协议服务器

TCP客户端

异步输入输出(异步)

任务(计划任务)

环境依赖性:

仅支持Linux、FreeBSD、MacOS和3个操作系统

2.3.32以上的Linux内核版本

PHP版本高于PHP5.3.10

gcc 4.4或以上版本或clang

Cmake2.4,编译成libswoole时需要使用cmake . so作为C/C库

安装:

系统中必须确保以下软件:

Php-5.3.10或更高版本

Gcc-4.4或更高

制造

autoconf

Swoole作为PHP的扩展运行

安装(根权限):

cd swoole

phpize。/configure

制造

sudo进行安装

配置php.ini

extension=swoole.so

想研究Swoole的同学,自己去看手册(虽然写的不好,但是还是能看懂的)

做一个聊天室

服务器端:socket.php

//创建websocket服务器对象,监听0.0.0.0:9502端口$ ws=new swoole _ web socket _ server(' 0。0 .0 .0 ',9502);//监听WebSocket连接打开事件$ws-on('open ',函数($ws,$ request){ $ FD[]=$ request-FD;$ GLOBALS[' FD '][]=$ FD;//$ws-push($request-fd,' hello,welcome \ n ');});//监听WebSocket消息事件$ws-on('消息',函数($ws,$frame) { $msg='from ' .$ frame-FD : { $ frame-data } \ n ';//var _ dump($ GLOBALS[' FD ']);//退出;foreach($GLOBALS['fd']为$aa){ foreach($aa)为$i){ $ws-push($i,$ msg);} } //$ws-push($frame-fd,' server : { $ frame-data } ');//$ws-push($frame-fd,' server : { $ frame-data } ');});//监听WebSocket连接关闭事件$ws-on('close ',函数($ws,$fd) { echo '客户端-{$fd}已关闭\ n ';});$ ws-start();客户端:Socket.html

!DOCTYPE html html lang=' en ' head meta charset=' UTF-8 ' title/title/head dydiv id=' msg '/divinput type=' text ' id=' text '输入类型=' submit ' value='发送数据onclick=' song()'/body脚本var msg=document。getelementbyid(' msg ');var wsServer=' ws ://192。168 .1 .253:9502 ';//调用websocket对象建立连接: //参数:ws/wss(加密)://ip:port(字符串)var web socket=new web socket(wsServer);//onopen监听连接打开web套接字。on open=function(evt){//web socket。readystate属性:/*正在连接0连接尚未打开欧洲标准1操作系统连接已打开,可以进行通信。关闭2连接正在关闭。关闭3连接已关闭或无法打开*/msg。innerhtml=web套接字。readystate};函数song(){ var text=document。getelementbyid(' text ').价值;document.getElementById('text ').值=' ';//向服务器发送数据websocket.send(文本);} //监听连接关闭//web套接字。onclose=function(evt){//console。日志(“已断开”);//};//onmessage监听服务器数据推送web套接字。on message=function(evt){ msg。innerhtml=evt。数据“br”;//console.log('从服务器:检索到的数据evt。数据);};//监听连接错误信息//web套接字。onerror=function(evt,e){//console。日志('出现错误d : ' evt。数据);//};/script/html以上就是基于Swoole实现服务器端编程语言(专业超文本预处理器的缩写)与websocket聊天室的全部内容,相信本文对大家学习服务器端编程语言(专业超文本预处理器的缩写)和websocket及开发聊天室很有帮助。

版权声明:基于Swoole的PHP和websocket聊天室的实现是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。