PHP和WebSocket聊天室基于swoole
WebSocketWebSocket是一种网络通信协议
像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开发聊天室。