基于Swoole框架的WebSocket的简易在线聊天

一、背景:学习+研究

技术栈:Swoole + Linux + jQuery + HTML + CSS

Swoole是高性能的PHP协程框架,适用于高并发、高性能要求的领域,为PHP性能的提升提供了独一无二的可能性。

WebSocket是B/S或C/S网络结构模式下实现双方实时通信的协议,是一种在单个TCP连接上进行全双工通信的协议。Swoole\Websocket\Server 继承自 Swoole\Http\Server,是实现了WebSocket协议的服务器。

只有WebSocket客户端才能与WebSocket服务器通信。

二、类说明

WebScoket 服务器:

Swoole\WebSocket\Server

方法:

onopen() 监听WebSocket连接打开事件

onmessage() 监听WebSocket消息事件

onclose() 监听WebSocket连接关闭事件

push() 推送消息到已连接的客户端

isEstablished() 判断WebSocket连接是否正确

代码片段解析:

1、使用 FILE 作为存储层实现数据存储,当然还可以选择Redis等服务,也可以用Swoole\Table等实现,这里只为学习 WebSocket。

2、发送消息的时候,每个消息都定义一个类型 type,便于客户端解析数据做业务逻辑。

type 类型有:

    USER_IN  用户登录

    USER_OUT 用户离开

    USER_MSG 用户发送的消息

3、$ws->isEstablished 是为了判断连接是否有效,保证推送消息能够成功。

if ($ws->isEstablished($fd)) {
     $ws->push($fd, json_encode($data));
}

4、服务器接收到消息时,服务器会轮询把消息推送给所有用户(包括消息发送者),所以要区分一下消息是否是自己发送的。

foreach ($ws->connections as $item_fd) {
	if($item_fd != $frame->fd){
		$data = [
			//'num' => $num,
			'msg' => $frame->data,
			'type' => 'USER_MSG',
			'from_fd' => $frame->fd
		];
		
		// 判断websocket连接是否正确,否则会push失败
		if ($ws->isEstablished($item_fd)) {
			$ws->push($item_fd, json_encode($data));
		}
	}else{
		$data = [
			//'num' => $num,
			'msg' => $frame->data,
			'type' => 'USER_MSG',
			'from_fd' => $frame->fd
		];
		$ws->push($frame->fd, json_encode($data));
	}
}

程序源码:

服务端:PHP代码:ws_chat_server.php

<?php
defin
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值