PHP和WebSocket聊天室基于swoole

WebSocket



WebSocket是一种网络通信协议



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



WebSocket是一个持续的网络通信协议与HTTP协议的非持续性。

WebSocket和HTTP之间的关系




有一个十字路口,但不是全部。



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

HTTP请求头和WebSocket的比较:




HTTP:



当时,客户端通过HTTP请求的服务器(骑)在信中,服务器处理请求(回写),然后返回通过HTTP(骑马);链路断开。

WebSocket:



客户端通过HTTP(马)的一封信的请求到服务器,但同时,随着升级:WebSocket连接:升级(两管),如果服务器支持WebSocket协议(两管接口),使用WebSocket协议返回信息(弃马),然后信息的传输,使用两管,除非有人党管切断;如果服务器不支持客户端的请求,连接失败,返回错误信息;

HTTP响应头和WebSocket:




之间的差异和Ajax轮询和长轮询的通信



第一个是Ajax轮询,Ajax轮询的原理非常简单,允许浏览器每隔几秒钟发送一次请求,询问服务器是否有新信息。



场景再现:



客户:啦啦队,你有什么新信息(要求)吗



服务器:没有(响应)



客户:啦啦队,你有什么新信息(要求)吗



服务器端:不,不(响应)



客户:啦啦队,你有什么新信息(要求)吗



服务员:你真烦人,没有啊。



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



服务器端:好的,我为你准备了。



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



服务器:不,不,不,不,不。

长轮询实际上与Ajax轮询一样,使用轮询,而不是在讨论中;

从上面可以看出,轮询实际上是不断建立HTTP连接,然后等待服务器端处理,这体现了HTTP协议的另一个特点和被动性,同时,在HTTP的每个请求和响应之后,服务器将丢弃所有客户端信息。下一个请求必须是没有状态的cookie。

WebSocket的出现,一个干净清洁的解决这些问题;

因此,上述情况可以修改如下。



客户:啦啦队,我想建立WebSocket协议,所需的服务:聊天,WebSocket协议版本:17(HTTP请求)



服务员:好的,确认,已经升级到WebSocket协议(HTTP协议切换)



顾客:有信息请推到我这里。



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



客户:balab开始斗图alabala



服务器:Sora Aoi ala



客户:鼻血,我擦…



服务器端:哈哈鲍勃教育公牛哈哈



服务器:杀了我哈哈

swoole



然而,一个完整的PHP HTML5 WebSocket请求和响应,穿越千山万水的兄弟,在森林的深处,找到了Swoole:

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



支持服务:



HTTP服务器



WebSocket服务器



TCP服务器



TCP客户端



异步IO(异步)



任务(定时任务)

环境依赖性:



只支持Linux,FreeBSD,MacOS操作系统的3种类型



Linux内核版本2.3.32以上



超过php5.3.10版



超过gcc4.4的或铿锵



cmake2.4 +,你需要使用cmake编译libswoole.so为C / C++库

安装:



在系统中保证以下软件是必要的:



php-5.3.10或更高版本



gcc-4.4或更高版本



使



autoconf

swoole运行作为一个PHP扩展



安装(根权限):



CD swoole



phpize



配置



使



sudo make install



配置php.ini



swoole.so延伸=

如果你想学习swoole的同学,去看手册(虽然不是很好,但它仍然可以被理解)。



制作聊天室

服务器端:socket.php


/ /创建的WebSocket服务器,监控0.0.0.0:9502端口
$ WS =新swoole_websocket_server(0.0.0.0

/ / WebSocket连接打开事件监测
WS - >对美元(打开功能($ WS,要求美元){
$;
美元'fd} { } = { = $ FD;
推($请求> FD,您好,欢迎;
});

听WebSocket消息 / /事件
WS - >对美元(消息功能(WS美元美元,框架){
味精=从美元美元-> FD框架。{ $帧>数据};
/ / var_dump($ = { 'fd});
/退出;
foreach($ = { 'fd}达AA){
foreach($ AA达我){
推送($ I,MSG);
}
}
推($帧> FD,服务器:{框架>数据});
推($帧> FD,服务器:{框架>数据});
});

/ /监测WebSocket连接关闭事件
美元在WS - >('关闭',功能($美元WS,FD){
客户机{ } }已关闭;
});

启动();


客户:socket.html






标题







var msg = document.getelementbyid(味精);
无功wsserver = 'ws: / / 192.168.1.253:9502;
/ /呼叫WebSocket对象建立连接:
/ / /参数:WS WSS(加密): / / IP端口(字符串)
VaR的WebSocket =新的WebSocket(wsserver);
/ /开放的监控连接打开
websocket.onopen =功能(EVT){
/ / websocket.readystate性质:
*
连接0,连接尚未打开。
打开1,连接已打开,准备通信。
关闭2连接正在关闭中。
关闭3连接关闭或无法打开。
* /
msg.innerhtml = websocket.readystate;
};

函数歌曲(){
var text = document.getelementbyid(中的)的价值;
document.getelementbyid(中的)价值= ';
将数据发送到服务器
Websocket.send(文本);
}
监视器连接关闭
/ / websocket.onclose =功能(EVT){
/ / console.log(断开);
};

/ /消息监控服务器的数据推送
websocket.onmessage =功能(EVT){
msg.innerhtml = evt.data +;
console.log('retrieved数据 / /服务器:+ EVT。数据);
};
监视连接错误消息
/ / websocket.onerror =功能(EVT,e){
/ / console.log(错误的发生:+ EVT。数据);
};





以上是PHP和WebSocket聊天室基于swoole完整内容,我相信这篇文章有助于大家学习PHP和WebSocket开发聊天室。