php用swool监听端口,利用Swoole实现PHP+websocket 聊天室

websocket

Websocket只是一个网络通讯协议

就像 http、ftp等都是网络通讯的协议;不要多想;

相对于HTTP这种非持久的协议来讲,Websocket是一个持久化网络通讯的协议;javascript

WebSocket和HTTP的关系

WebSocket和HTTP的关系

有交集,可是并非所有。

2378b8ab640e6cc41c1d3bf7fa4554f9.pngphp

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

http和websocket 请求头对比:java

2d450e667f52b8b0f370f8ad08bae4f1.png 

af04f43e085c2439d607298efc6a13ab.png

HTTP:

原来的时候,客户端经过http(骑马)带着信请求服务器,服务器处理请求(写回信),再次经过http(骑马)返回;连接断开;web

WebSocket:

客户端经过http(骑马)带着信请求服务器,但同时,携带了Upgrade:websocket和Connection:Upgrade(两根管子),服务器若是支持WebSocket协议(有两根管子的接口),使用Websocket协议返回可用信息(丢弃马匹),此后信息的传递,均使用这两个管子,除非有一方人为的将管子切断;

若服务器不支持webscoket,客户端请求连接失败,返回错误信息;ajax

http和websocket 响应头对比:

de73c506d64bb7b8d20c3a44e2c8a5fb.png 

04fb76ff09ae43f40c6ae730077a8ed9.png数据库

websocket和ajax轮询、long poll的区别

首先是 ajax轮询 ,原理很是简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息

场景再现:

客户端:啦啦啦,有没有新信息(Request)

服务端:没有(Response)

客户端:啦啦啦,有没有新信息(Request)

服务端:没有。。(Response)

客户端:啦啦啦,有没有新信息(Request)

服务端:你好烦啊,没有啊。。(Response)

客户端:啦啦啦,有没有新消息(Request)

服务端:好啦好啦,有啦给你。(Response)

客户端:啦啦啦,有没有新消息(Request)

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

long poll 其实原理跟 ajax轮询 差很少,都是采用轮询的方式,不在论述;服务器

从上面能够看出,轮询其实就是在不断地创建HTTP链接,而后等待服务端处理,能够体现HTTP协议的另一个特色,被动性。同时,http的每一次请求与响应结束后,服务器将客户端信息所有丢弃,下次请求,必须携带身份信息(cookie),无状态性;websocket

Websocket的出现,干净利落的解决了这些问题;

因此上面的情景能够作以下修改。

客户端:啦啦啦,我要创建Websocket协议,须要的服务:chat,Websocket协议版本:17(HTTP Request)

服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched)

客户端:麻烦你有信息的时候推送给我噢。。

服务端:ok,有的时候会告诉你的。

客户端:balab开始斗图alabala

服务端:苍井空ala

客户端:流鼻血了,我擦……

服务端:哈哈啊哈哈哈哈

服务端:笑死我了哈哈

很遗憾:Nginx和Apache 不支持WebSocket协议!

Swoole

可是,为了用PHP配合HTML5完成一次WebSocket请求和响应,哥走过千山万水,在密林深处,发现了Swoole : http://www.swoole.com/;

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

支持的服务:

HttpServer

WebSocket Server

TCP Server

TCP Client

Async-IO(异步)

Task(定时任务)

环境依赖:

仅支持Linux,FreeBSD,MacOS,3类操做系统

Linux内核版本2.3.32以上

PHP5.3.10以上版本

gcc4.4以上版本或者clang

cmake2.4+,编译为libswoole.so做为C/C++库时须要使用cmake

安装:

必须保证系统中有如下这些软件:

php-5.3.10 或更高版本

gcc-4.4 或更高版本

make

autoconf

Swoole是做为PHP扩展来运行的

安装(root权限):

cd swoole

phpize

./configure

make

sudo make install

配置php.ini

extension=swoole.so

想研究Swoole的同窗,本身去看手册(虽然写的很差,可是仍是能看懂的)

作一个聊天室

服务器端:socket.php

//建立websocket服务器对象,监听0.0.0.0:9502端口

$ws = new swoole_websocket_server("0.0.0.0", 9502);

//监听WebSocket链接打开事件

$ws->on('open', function ($ws, $request) {

$fd[] = $request->fd;

$GLOBALS['fd'][] = $fd;

//$ws->push($request->fd, "hello, welcome\n");

});

//监听WebSocket消息事件

$ws->on('message', function ($ws, $frame) {

$msg = 'from'.$frame->fd.":{$frame->data}\n";

//var_dump($GLOBALS['fd']);

//exit;

foreach($GLOBALS['fd'] as $aa){

foreach($aa as $i){

$ws->push($i,$msg);

}

}

// $ws->push($frame->fd, "server: {$frame->data}");

// $ws->push($frame->fd, "server: {$frame->data}");

});

//监听WebSocket链接关闭事件

$ws->on('close', function ($ws, $fd) {

echo "client-{$fd} is closed\n";

});

$ws->start();

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

客户端:Socket.html

Title

var wsServer = 'ws://192.168.1.253:9502';

//调用websocket对象创建链接:

//参数:ws/wss(加密)://ip:port (字符串)

var websocket = new WebSocket(wsServer);

//onopen监听链接打开

websocket.onopen = function (evt) {

//websocket.readyState 属性:

/*

CONNECTING 0 The connection is not yet open.

OPEN 1 The connection is open and ready to communicate.

CLOSING 2 The connection is in the process of closing.

CLOSED 3 The connection is closed or couldn't be opened.

*/

msg.innerHTML = websocket.readyState;

};

function song(){

var text = document.getElementById('text').value;

document.getElementById('text').value = '';

//向服务器发送数据

websocket.send(text);

}

//监听链接关闭

// websocket.onclose = function (evt) {

// console.log("Disconnected");

// };

//onmessage 监听服务器数据推送

websocket.onmessage = function (evt) {

msg.innerHTML += evt.data +'
';

// console.log('Retrieved data from server: ' + evt.data);

};

//监听链接错误信息

// websocket.onerror = function (evt, e) {

// console.log('Error occured: ' + evt.data);

// };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值