IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> workerman经过梳理,简单实现了http服务代码 -> 正文阅读

[网络协议]workerman经过梳理,简单实现了http服务代码

经过了简单的梳理workerman代码流程,发现了workerman架构对TCP\UDP与HTTP的协议用PHP重新实现了一遍,我把workerman的简单实现webServer的代码整理出来了,代码如下:

<?php
$_builtinTransports = array(
    'ssl'   => 'tcp'
);

$adderss="0.0.0.0:8011";
$transport = 'ssl';
$flags = $transport === 'udp' ? STREAM_SERVER_BIND : STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
$options = [
    'http' => [
        'method' => 'GET',
        'header' => 'Accept-language: en\r\n'
    ]
];

$context = stream_context_create($options);
stream_context_set_option($context, 'socket', 'so_reuseport', 1);
$mainSocket = stream_socket_server($adderss,$errno,$errmsg,$flags,$context);
if(!$mainSocket) {
    exit($errmsg);
}

if($transport === 'ssl')
{
    stream_socket_enable_crypto($mainSocket,false);
}

if(function_exists('socket_import_stream') && $_builtinTransports[$transport] === 'tcp')
{
    set_error_handler(function(){});
    $socket = socket_import_stream($mainSocket);
    socket_set_option($socket,SOL_SOCKET,SO_KEEPALIVE,1);
    socket_set_option($socket,SOL_TCP,TCP_NODELAY,1);
    restore_error_handler();
}

stream_set_blocking($mainSocket,false);


function acceptConnection($socket)
{
    set_error_handler(function(){});
    $new_socket = stream_socket_accept($socket, 0, $remote_address);
    restore_error_handler();

    stream_set_blocking($new_socket, 0);
    stream_set_read_buffer($new_socket, 0);
    $bytesRead = 0;
    $recvBuffer = null;
    $buffer = fread($new_socket, 65535);

    $bytesRead+= strlen($buffer);
    $recvBuffer .= $buffer;

    $bufferArr = explode("\r\n",$buffer);
    $headerStr = '';
    if(!empty($bufferArr))
    {
        foreach($bufferArr as $header)
        {
            if(!empty($header))
            {
                $headerStr .= $header."\r\n";
            }
           
        }
    }

    $bytesRead += strlen($buffer);
    $recvBuffer .= $buffer;


    $sendBuffer = "hello word3333";

    $body_len = \strlen($sendBuffer);
    $sendBuffer = "HTTP/1.1 200 OK\r\nServer: xiaobo\r\n{$headerStr}Connection: keep-alive\r\nContent-Type: text/html;charset=utf-8\r\nContent-Length: $body_len\r\n\r\n$sendBuffer";

    $len = fwrite($new_socket, $sendBuffer);

    fclose($new_socket);
}

while(1)
{

    $fd_key = (int)$mainSocket;
    $read[$fd_key] = $mainSocket;
    $write[$fd_key] = $mainSocket;
    $except = [];
    $allExcept[$fd_key][1] = $mainSocket;
    $ret = false;

    @stream_select($read, $write, $except, 0, 15);

    foreach($read as $fd)
    {
        $fd_key = (int)$fd;
        if(isset($allExcept[$fd_key][1]))
        {
            var_dump($fd_key);
            acceptConnection($allExcept[$fd_key][1]);
        }
    }
}

?然后执行php webServer.php
效果如下图:

?

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-24 11:51:07  更:2021-07-24 11:51:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 17:42:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码