Swoole学习之TCP,UDP,HTTP服务

Swoole 官方文档: https://wiki.swoole.com/
根据慕课网视频学习:https://coding.imooc.com/class/197.html服务端
1.快速搭建TCP服务端
 

<?php

//创建Server对象,监听 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);

$serv->set([
    'worker_num'    => 4,
    'max_request'   => 1000
]);

//监听连接进入事件
/**
 * $fd  是客户端连接的唯一标识
 * $reactor_id 线程id
 */
$serv->on('connect', function ($serv, $fd ,$reactor_id) {
    echo " Client {$reactor_id} - {$fd}: Connect.\n";
});

//监听数据接收事件
$serv->on('receive', function ($serv, $fd, $reactor_id, $data) {
    echo $data."\n";
    $serv->send($fd, "Server {$reactor_id} - {$fd} : ".$data);
});

//监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
    echo "Client: {$fd}  Close.\n";
});

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



先new一个swoole_server对象
可以set设置配置项,具体配置的意义可参考文档
函数
connect监听连接进入事件函数,在有用户连接tcp服务,自动调用
参数:
$serv 是tcp服务的实例
$fd 是客户端连接的唯一标识
$reactor_id 是线程id

receive监听数据接收函数,在用户发送数据给tcp服务时,自动调用
参数:
$data 接收的客户端发送过来的数据

send ( $fd,$data )发送数据函数 ,是给指定的客户端发送数据
参数:
$fd 需要发送给哪个客户端
$data 需要发送的数据

close监听连接关闭函数,当一个连接关闭时自动调用

start 启动服务器,上述的操作都应该在start之前执行

连接服务端:

telnet 127.0.0.1 9501


2.UDP服务端
与TCP类似//创建Server对象,监听 127.0.0.1:9502端口,类型为SWOOLE_SOCK_UDP

$serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);

//设置参数
$serv->set([
    'worker_number'  =>5,   //worker的进程数
    'max_request'    =>5000 //一个进程可以处理用户数
]);

//监听数据接收事件
$serv->on('packet',function ($serv,$data,$client_info){
        $serv->sendto($client_info['address'],$client_info['port'],$data,$client_info['server_socket']);
        var_dump($client_info);
});

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


与TCP不同的是 在new 一个swoole_server对象的时候,最后一个参数要改成SWOOLE_SOCK_UDP这是swoole自带的常量

swoole自带常量 : https://wiki.swoole.com/wiki/page/26.html

在UDP中,使用onPacket回调函数来监听数据接收事件.

$data接收客户端发送的数据
$client_info客户端的信息,是一个数组格式,包括 address,port,server_socket
example:

Array
(
    [server_socket] => 3
    [server_port] => 9502
    [address] => 127.0.0.1
    [port] => 44833
)


发送消息给客户端时,使用sendto函数

$ip也就是ip
$port端口号
$data要发送的数据内容
其他似乎与TCP基本一样

3.HTTP服务端
基于swoole_server , 但与swoole_server区别挺大的

<?php

$http  = new swoole_http_server('0.0.0.0',8811);

$http->set([
    'enable_static_handler' =>  true,
    'document_root' => '/marun'
]);

$http->on('request',function ($request,$response){

    print_r($request->get);
    $response->cookie('run','666666666',60);
    $response->end(json_encode($request->get));
});

$http->start();



在HTTP服务端中,我们需要new 一个 swoole_http_server对象 ,只需要传递ip和端口就行

这里将ip设置为0.0.0.0 我们就可以通过外网直接在浏览器中来访问这个页面
具体效果,通过网站加端口的方式访问,还可以通过地址栏传递数据,并通过$request->get接收,response只能返回字符串格式,所以使用json_decode将数据转换


set这里设置两个参数,目的是与Apache和nginx类似.可以通过路径访问某个静态页面
enable_static_handler在使用静态页面的时候,必须开启
document_root 静态页面的路径
具体效果: 我们通过地址栏访问index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>通过swoole访问的</title>
</head>
<body>
<h1>我是通过swoole访问进来的静态资源内容.</h1>
</body>
</html>

index.html放到document_root指定的路径下就行,具体用法与Apache一样 

客户端

使用客户端连接服务端

1.TCP客户端

<?php
//连接 swoole tcp服务端
$client = new swoole_client(SWOOLE_SOCK_TCP);


//连接到服务器
if(!$client->connect('127.0.0.1',9501)){
    echo '连接失败';
    exit;
}

//php cli模式下
fwrite(STDOUT,"请输入消息: ");
$msg = trim(fgets(STDIN));


//向服务器发送数据
if (!$client->send($msg))
{
    echo '发送失败';exit;
}

//从服务器接收数据
$data = $client->recv();

if (!$data)
{
    echo '接收失败';exit;
}

echo $data."\n";

//关闭连接
$client->close();

 

与服务端类似,先new一个swoole_client对象,参数是swoole的常量SWOOLE_SOCK_TCP 代表这是一个TCP客户端
connect连接服务端,传递ip和端口.返回值是true 或false
这里的fwrite(STDOUT,"请输入消息: ")视频里老师说的是swoole是基于PHP cli模式运行的 使用CLI的常量,以后再说,可以参考下PHP手册 http://php.net/manual/zh/features.commandline.php 具体运行效果如下:

在后面输入数据.会被fgets(STDIN)接收.然后下面使用send发送给服务端
send函数 , 向服务端发送数据,成功返回发送数据的长度,失败返回false
recv接收服务端发送给客户端的数据 , 成功收到数据返回字符串, 连接关闭返回空字符串失败返回 false,并设置$client->errCode属性
2.UDP客户端
与TCP一样 , 不过在new swoole_client客户端的时候,传递SWOOLE_SOCK_UDP常量,代表UDP模式

<?php

/**
 *  SWOOLE_SOCK_UDP 代表UDP模式
 */
$client = new swoole_client(SWOOLE_SOCK_UDP);

//连接  与服务端的host和poet一致
if(!$client->connect('127.0.0.1',9502)){
    echo '连接失败';
    die;
}

/**
 * PHP  CLi模式下的一个常量
 */
fwrite(STDOUT,'请输入消息: '); //输入消息
$msg = trim(fgets(STDIN)); //返回值就是输入的消息

//发送消息给 tcp 服务端
$client->send($msg);

//接收来自server服务端的返回消息
$res = $client->recv();
echo $res."\n";

3.HTTP客户端

不用了…直接用浏览器访问对应的ip和端口就可以了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值