道者编程

swoole学习之二:入门小实例

下面这几个实例都来源于swoole官网,某些地方稍微改了下。

一:HTTP

基于swoole构建一个简单的http服务器,类似于nginxapache,不过没有这么强大,这个例子只有简单的请求和响应。

1:先创建一个http.php文件。

<?php
//初始化http服务,绑定端口9501,IP为160
$ip = '192.168.17.160';
$http = new swoole_http_server($ip, 9501); //swoole_http_server 继承自 swoole_server

//服务器启动后响应信息
$http->on("start", function ($server)use($ip) {
    echo "Swoole http server is started at $ip:9501\n";
});

//该服务收到请求时的响应,这里可以设置响应头,响应内容,可以获取请求的参数
$http->on("request", function ($request, $response) {
    $response->header("Content-Type", "text/plain"); //响应头
    print_r($request->get); //输出GET请求参数
    $response->end("Hello World\n"); //响应内容
});

$http->start(); //启动服务

2:CGI方式运行程序

$  /usr/local/php/bin/php http.php #找到php位置

 可以看到,红色部分为启动后响应的信息

3:客服端访问

因为我们是http服务,我们就用浏览器访问一下

成功输出

我们加点参数

这里我们GET一个name=李小龙的参数,看看服务有没有收到这个参数

可以看到数据成功接收。

二:TCP

创建TCP服务端,tcp_server.php

<?php
$ip = '192.168.17.160';
//创建TCP服务
$server = new swoole_server($ip, 9503);

//服务启动后响应信息
$server->on("start", function ($server)use($ip) {
    echo "Swoole tcp server is started at $ip:9503\n";
});

//服务链接时响应信息
$server->on('connect', function ($server, $fd){
    echo "connection open: {$fd}\n";
});

//接受消息后返回信息
$server->on('receive', function ($server, $fd, $reactor_id, $data) {
    $server->send($fd, "Swoole: {$data}");
    $server->close($fd);
});
//链接关闭时返回信息
$server->on('close', function ($server, $fd) {
    echo "connection close: {$fd}\n";
});
//启动服务
$server->start();

 把程序跑起来:


我们用客服端工具链接一下:

这张图展示了链接和发送,以及断开过程

用程序演示一下这个过程,新建一个tcp_client.php

<?php
/*创建客户端
SWOOLE_SOCK_TCP:tcp socket
SWOOLE_SOCK_ASYNC:异步客户端 */
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);

//发送数据 hello world
$client->on("connect", function($cli) {
    $cli->send("hello world\n");
});
//接受服务端返回的信息
$client->on("receive", function($cli, $data){
    echo "received: {$data}\n";
});
//返回错误信息
$client->on("error", function($cli){
    echo "connect failed\n";
});
//关闭时返回的信息
$client->on("close", function($cli){
    echo "connection close\n";
});
//链接 0.5:网络IO的超时:0.5s
$client->connect("192.168.17.160", 9501, 0.5);
 前面我们启动了服务端,现在运行一下客服端,客服端会链接TCP服务端,然后发出hello world。

可以看到服务端返回了我们发送的消息

服务端本身也记录了过程日志

三:UDP

在swoole中,TCP和UDP的使用方法差不多,只要修改几个配置即可

//创建TCP服务端,默认为TCP
$server = new swoole_server($ip, 9503);

//TCP客服端:SWOOLE_SOCK_TCP
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);


//创建UDP服务端:SWOOLE_SOCK_UDP
$server = new swoole_server($ip, 9503,SWOOLE_PROCESS, SWOOLE_SOCK_UDP); 

//UDP客服端:SWOOLE_SOCK_UDP 
$client = new swoole_client(SWOOLE_SOCK_UDP, SWOOLE_SOCK_ASYNC);

 四:WebSocket

新建websocket.php

<?php
$ip = '0.0.0.0';
//创建websocket服务端
//swoole_websocket_server 继承swoole_http_server
$server = new swoole_websocket_server($ip, 9504); 
//链接时响应
$server->on('open', function($server, $req) {
    echo "connection open: {$req->fd}\n";
});

//响应消息
$server->on('message', function($server, $frame) {
    echo "received message: {$frame->data}\n";
    $server->push($frame->fd, json_encode(["hello", "world"]));
});

//链接关闭时返回信息
$server->on('close', function($server, $fd) {
    echo "connection close: {$fd}\n";
});

$server->start();
启动后,用chrome浏览器模拟一下JS:

 // 打开一个 web socket
var ws = new WebSocket("ws://192.168.17.160:9504");
ws.onopen = function()
{
   // Web Socket 已连接上,使用 send() 方法发送数据
   ws.send("Test数据");
   alert("数据发送中...");
};
         
ws.onmessage = function (evt) 
{ 
   var received_msg = evt.data;
   alert("数据已接收...");
};
                
ws.onclose = function()
{ 
   // 关闭 websocket
   alert("连接已关闭..."); 
};

 F12->Console,粘贴以上js,然后回车运行

再去看看服务端:

可以看到php 服务端已经接受到信息:Test数据

WebSocke


最新评论:
我要评论:

看不清楚