内容简介:教程使用以下是一些有可能有帮助的资料:童鞋们也可以像我一样在
教程使用 Swoole 4.3.0 版本开发,但并没有使用协程等功能,只是使用了 WebSocket Server ,理论上安装旧版也是没问题的。环境需要大家自行安装,这个也是学习的一个过程。
以下是一些有可能有帮助的资料:
-
CentOS中一键安装PHP开发环境: lnmp.org/install.htm… -
Swoole安装教程: wiki.swoole.com/wiki/page/6… -
Redis安装教程:redis.io/download -
php-redis扩展包: pecl.php.net/package/red…
童鞋们也可以像我一样在 Windows 使用 PHPStorm 进行开发,再通过一些方法如 共享文件夹 、 WinSCP 等 工具 将项目在 CentOS 中运行起来。
安装swoole-ide-helper扩展
使用 PHPStorm 来开发 Swoole 项目的童鞋,如果不想面向运气编程的话,最好安装一个 swoole-ide-Helper 扩展来协作开发。
在项目根目录运行以下命令:
composer require --dev "eaglewu/swoole-ide-helper:dev-master" 复制代码
安装完毕我们就可以愉快地编写 Swoole 代码了。
服务端基本架构
赵童鞋设想的基本架构需要三个层,他们分别是:
Swoole WebSocket
管理这三个层分别需要三个类: Server 、 Logic 、 DataCenter 。
其中最重要的就是 Server 类,它的作用就是作为服务端和客户端的消息交换中心,我们先来写一个初始化的 Server 类,在项目 app 目录新建 Server.php 。
- 使用面向对象的方式实现一个
WebSocket Server类。 - 分别绑定
start、workerStart、open、message、close回调方法 - 在类中引入
composer自动加载机制。 - 为
WebSocket对象设置4个worker进程。
-
Swoole Websocket: wiki.swoole.com/wiki/page/3…
Server 类:
<?php
require_once __DIR__ . '/../vendor/autoload.php';
class Server
{
const HOST = '0.0.0.0';
const PORT = 8811;
const CONFIG = [
'worker_num' => 4,
];
private $ws;
public function __construct()
{
$this->ws = new \Swoole\WebSocket\Server(self::HOST, self::PORT);
$this->ws->set(self::CONFIG);
$this->ws->on('start', [$this, 'onStart']);
$this->ws->on('workerStart', [$this, 'onWorkerStart']);
$this->ws->on('open', [$this, 'onOpen']);
$this->ws->on('message', [$this, 'onMessage']);
$this->ws->on('close', [$this, 'onClose']);
$this->ws->start();
}
public function onStart($server)
{
swoole_set_process_name('hide-and-seek');
echo sprintf("master start (listening on %s:%d)\n",
self::HOST, self::PORT);
}
public function onWorkerStart($server, $workerId)
{
echo "server: onWorkStart,worker_id:{$server->worker_id}\n";
}
public function onOpen($server, $request)
{
}
public function onClose($server, $fd)
{
}
public function onMessage($server, $request)
{
}
}
new Server();
复制代码
我们来运行一下 Server.php 文件,顺便检验一下 Swoole 扩展是否运行正常,在项目 app 目录下,运行 php Server 。
- 后面所有启动
Server操作都是基于CentOS环境
[root@localhost app]# php Server.php master start (listening on 0.0.0.0:8811) server: onWorkStart,worker_id:0 server: onWorkStart,worker_id:1 server: onWorkStart,worker_id:2 server: onWorkStart,worker_id:3 复制代码
如果输出以上信息,就代表 Server 运行成功。
Logic 类和 DataCenter 类属于游戏管理类,在 Manager 文件夹下新建 Logic.php 和 DataCenter.php 文件,并在 Datacenter 类中增加一个格式化输出日志的 log() 方法。
Logic 类:
<?php
namespace App\Manager;
class Logic
{
}
复制代码
DataCenter 类:
<?php
namespace App\Manager;
class DataCenter
{
public static function log($info, $context = [], $level = 'INFO')
{
if ($context) {
echo sprintf("[%s][%s]: %s %s\n", date('Y-m-d H:i:s'), $level, $info,
json_encode($context, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));
} else {
echo sprintf("[%s][%s]: %s\n", date('Y-m-d H:i:s'), $level, $info);
}
}
}
复制代码
前端初始化
前端我们将会使用 Vue 框架来开发,项目只使用到了 v-if 、 v-for 、 <template> 、 WebSocket 技术。如果没有接触过前端框架的童鞋,可以尝试阅读官方文档。
-
Vue官方文档: cn.vuejs.org/v2/guide/ -
v-if: cn.vuejs.org/v2/guide/co… -
v-for: cn.vuejs.org/v2/guide/li… -
<templater>: cn.vuejs.org/v2/guide/li…
在项目根目录创建 frontend 文件夹,并在其中创建 index.html 文件,进行前端初始化。
- 使用
CDN的形式引入Vue框架。 - 根据
Vue官方文档,编写一个HelloWorld页面。
index.html :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>HideAndSeek</title>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
<link rel="icon" href="data:;base64,=">
</head>
<body>
<div id="app">
{{ message }}
</div>
<script>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
</body>
</html>
复制代码
前端的 HelloWorld 页面我们也有了,但是我们要怎么通过 HTTP 请求获取到这个页面呢?这时候就需要使用 Swoole 的 Static Handler 功能。
-
Swoole Static Handler文档: wiki.swoole.com/wiki/page/7…
- 根据官方文档添加
Swoole Static Handler配置。 - 为
Server新增一个监听端口8812,用于处理HTTP请求。
Server 类:
const FRONT_PORT = 8812;
const CONFIG = [
...
'enable_static_handler' => true,
'document_root' =>
'/mnt/htdocs/HideAndSeek_teach/frontend',
];
public function __construct()
{
...
$this->ws->listen(self::HOST, self::FRONT_PORT, SWOOLE_SOCK_TCP);
...
}
复制代码
记得将代码中的 document_root 改为自己项目的前端目录哦。
添加完以上代码后,在虚拟机中运行 Server ,并尝试通过浏览器访问 http://虚拟机ip:8812/index.html 浏览前端页面。
看到以上画面就代表访问成功。
WebSocket初始化
现在项目的服务端有了,前端页面有了,就差一个桥梁把他们连接起来,这个桥梁就是 WebSocket 通信机制,项目使用到了简单的 websock.onmessage 、 websock.onopen 、 websock.onerror 、 websock.onclose 。
以下是一些有可能有帮助的资料。
- 阮一峰
WebSocket教程: www.ruanyifeng.com/blog/2017/0… -
Vue生命周期: cn.vuejs.org/v2/guide/in… -
Swoole WebSocket onMessagewiki.swoole.com/wiki/page/4…
- 为
Vue实例新增data属性websock,在Vue实例创建完毕后,初始化WebSocket连接服务端并绑定上述四个方法。 - 在
WebSocket对象建立连接后,立刻发送消息到服务端。 - 服务端接收到客户端发送的消息后,通过客户端的
fd返回一条消息。 - 服务端增加客户端连接日志输出。
- 在页面关闭时,断开
WebSocket连接。
- 不清楚
fd是什么的童鞋可以参考Swoole官方文档: wiki.swoole.com/wiki/page/5…
本章项目初始化就到这里啦,请童鞋们尽量完成自己的Homework后,再进入下一章的学习。
当前项目结构:
HideAndSeek
├── app
│ ├── Manager
│ │ ├── DataCenter.php
│ │ ├── Game.php
│ │ └── Logic.php
│ ├── Model
│ │ ├── Map.php
│ │ └── Player.php
│ └── Server.php
├── composer.json
├── composer.lock
├── frontend
│ └── index.html
├── test.php
└── vendor
├── autoload.php
└── composer
复制代码
以上所述就是小编给大家介绍的《用Swoole来写个联机对战游戏呀!(五)联机初始化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 重命名与迁移联机数据文件
- 从动物森友会聊主机游戏联机原理
- 滥用word联机视频特征执行恶意代码POC
- 用Swoole来写个联机对战游戏呀!(一)前言
- 用Swoole来写个联机对战游戏呀!(三)完善游戏功能
- 用Swoole来写个联机对战游戏呀!(四)游戏结束判断
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。