文档章节

Swoole入门(2)☞创建TCP服务器

ali安东尼
 ali安东尼
发布于 2017/09/11 14:59
字数 1742
阅读 21
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

###编码前的准备

在编码之前需要简单了解下网络协议,下面主要介绍一下协议中的TCP、UDP协议,何两者区别是?

###何为网络通信协议?

从计算机时代的开始,由一个个相互独立的计算机,到计算机和计算机互联,最后形成一个计算机互联网;而这其中的互联是就是通过互联网规定的通信协议来实现的,它规定了如何在两机之间传输,规定了传输数据的大小,方式。

###TCP协议

TCP最主要的一个特点是可靠可靠可靠;即提供可靠的数据传输服务。

那么TCP要保证可靠性,就需要在源和目的方建立一个连接来维持可靠性,而这个连接就叫三次握手。下面简单接收三次握手过程:

i. 主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话

ii. 主机B向主机A发送同意连接和要求同步的数据包:“可以,你什么时候发?”,这是第二次对话

iv. 三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据,这样就保证了两者通信的可靠和稳定。

###UDP协议

UDP最主要的一个特点,就是不可靠;这个特点引发出下面几个特性:

所以在传输数据时不需要建立连接。

UDP无法保证数据能够准确的交付到目的主机。

UDP的数据包结构比TCP简单的多。

###QQ使用案例

【QQ登陆过程】:在登陆过程,客户端client采用TCP协议向服务器server发送信息,HTTP协议下载信息。登陆之后,会有一个TCP连接来保持在线状态。

【QQ发消息】:当和好友发消息,客户端client采用UDP协议,但是需要通过服务器转发。腾讯为了确保传输消息的可靠,采用上层协议来保证可靠传输。如果消息发送失败,客户端会提示消息发送失败,并可重新发送。

【内网传输文件】:如果是在内网里面的两个客户端传文件,QQ采用的是P2P技术,不需要服务器中转。

###创建TCP服务器

在简单介绍了TCP和UDP协议之后,我们来创建一个见到那的TCP服务器。

    $serv = new swoole_server("127.0.0.1", 9501);           $serv->set(array(         'reactor_num' => 2, //reactor thread num         'worker_num' => 4,    //worker process num         'backlog' => 128,   //listen backlog         'max_request' => 50,         'dispatch_mode' => 1,     ));

    $serv->on('connect', function ($serv, $fd) {           echo "Client: Connect.\n";     });          $serv->on('receive', function ($serv, $fd, $from_id, $data) {         $serv->send($fd, "Server: ".$data);     });          $serv->on('close', function ($serv, $fd) {         echo "Client: Close.\n";     });          $serv->start(); 

####下面简单介绍一下每一行的代码:

new swoole_server(string $host, int $port, int $mode = SWOOLE_PROCESS,     int $sock_type = SWOOLE_SOCK_TCP);

1.指定监听的ip地址,可以是内网地址、外网地址、IPv6地址;其中0.0.0.0监听全部地址。

2.指定监听的端口;需要注意的是小于1024端口是需要root权限;若端口已被占用会报错。

3.运行的模式,swoole提供了3种运行模式,默认为多进程模式。

4.指定socket的类型,支持TCP/UDP、TCP6/UDP6、UnixSock Stream/Dgram 6种

swoole_server->set

该函数用于设置swoole_server运行时的各项参数。

reactor_num => 2,此参数是用户来调节poll线程的数量,以充分利用多核。

worker_num => 4,此参数用来设置启动的worker进程数量。swoole采用固定worker进程的模式。

如果PHP代码中是全异步非阻塞,worker_num配置为CPU核数的1-4倍即可。

如果是同步阻塞,worker_num配置为100或者更高,具体要看每次请求处理的耗时和操作系统负载状况。

当设定的worker进程数小于reactor线程数时,会自动调低reactor线程的数量。

backlog => 128

此参数将决定最多同时有多少个待accept的连接,swoole本身accept效率是很高的,基本上不会出现大量排队情况。

max_request => 2000

此参数表示worker进程在处理完n次请求后结束运行。manager会重新创建一个worker进程。此选项用来防止worker进程内存溢出。

设置为0表示不自动重启。

$serv->on表示注册事件回调函数。

1.回调的名称,但是大小写不敏感。

2.回调的PHP函数,可以是函数名的字符串,类静态方法,对象方法数组,匿名函数。

connect表示监听连接进入事件、receive表示监听数据接收事件、close表示监听连接关闭事件。

swoole_server->send(int $fd, string $data, int $reactorThreadId = 0);表示向客户端发送数据。

$fd就是客户端连接的唯一标识符

$data,发送的数据。TCP协议最大不得超过2M,UDP协议不得超过64K

发送成功会返回true。发送失败会返回false。

swoole_server->start()

启动swoole_server,并监听所有TCP/UDP端口,函数原型:

启动成功后会创建worker进程(可设置)+2个进程。这两个主要进程为主进程+Manager进程

###运行代码

再运行的代码之前,需要知道Swoole的绝大部分功能只能用于cli命令行环境。所以再命令行中使用php server.php即可。

ok,没有报错,再查看使用正常运行netstat -tulnp | grep 9501,如果端口存在表示TCP服务端正在运行且正在监听中。

    root@silence-host:/home/silence# netstat -tulnp | grep 9501     tcp        0      0 0.0.0.0:9501            0.0.0.0:*               LISTEN      2061/php

此时打开另一个终端,使用telnet和TCP服务端进行通信:telnet 127.0.0.1 9501

输入hello,结果如下,其中Server: hello是服务器端返回的消息;就这样成功创建一个简单的TCP服务器了。     telnet 127.0.0.1 9501     hello     Server: hello

###创建UDP服务器

创建UDP服务器和创建TCP服务器大致原理相同,不同的是UDP协议不可靠,没有建立连接的概念,只负责接收发送。

    $serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);           $serv->on('Packet', function ($serv, $data, $clientInfo) {         $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data);         var_dump($clientInfo);     });          $serv->start();

1.其中再创建Server对象需要注意的是,创建类型为SWOOLE_SOCK_UDP,表示UDP协议。

2.UDP注册的事件是Packet。

3.woole_server->sendto(string $ip, int $port, string $data, int $server_socket = -1);向任意的客户端IP:PORT发送UDP数据包。

$ip为IPv4字符串,如192.168.1.102。如果IP不合法会返回错误

$port为 1-65535的网络端口号,如果端口错误发送会失败

$data要发送的数据内容,可以是文本或者二进制内容

###结语

接下来继续深入了解swoole的task模块把!

由睿江云人员提供,想了解更多,请登陆www.eflycloud.com

© 著作权归作者所有

ali安东尼
粉丝 3
博文 192
码字总数 173101
作品 0
广州
私信 提问
加载中

评论(0)

mac php Swoole入门

一、 swoole 扩展安装 安装前必须保证系统已经安装了下列软件 或更高版本 或更高版本 (系统可以执行命令:) 下载地址: https://github.com/swoole/swoole-src/releases http://pecl.php.net...

osc_96dtf5e4
2019/07/11
1
0
php搭建swooleTCP服务器

这次的swoole学习,比较缓慢 也由于这些几天事比较多,晚上没去学习,swoole的笔记也一直在没编写,下面简单介绍和应用下swoole swoole是什么? 异步、并行、高性能 纯C编写 php扩展 swoole...

osc_57loaj8m
2018/12/22
6
0
【转】Swoole引擎原理的快速入门干货

过去一年使用PHP和Java两种技术栈完成了一个游戏服务器项目。由于项目中有高频的网络请求,所以PHP技术栈尝试使用Swoole引擎(基于事件的高性能异步并行网络通信引擎)来完成部分游戏业务。 ...

神奇的旋风
04/05
0
0
[Swoole] 在Ubuntu下安装、快速开始

本文主要讲述在 Ubuntu 下编译安装 Swoole,并根据官方文档给出的demo进行了测试和搬运,包括:TCP服务器、UDP服务器、HTTP服务器、WebSocket服务器、异步客户端、定时器和协程相关,通过模仿...

osc_o1mwzw8v
04/16
2
0
nginx、php-fpm、swoole HTTP/TCP压测对比

本次测试是在win7下docker环境中进行压测,共创建一个nginx容器、一个php-fpm容器和一个swoole容器,客户端请求nginx服务器,nginx接收用户访问请求并转发给php-fpm,php-fpm接收数据并发送数...

osc_1njk964l
2018/09/13
6
0

没有更多内容

加载失败,请刷新页面

加载更多

时间片轮询法

时间片轮询法 时间片轮询法是一种比较简单易用的系统架构之一,它对于系统中的任务调度算法是分时处理。核心思路是把 CPU 的时间分时给各个任务使用。我们常用的定时方法是定时器,把调度器放...

osc_j7rfhwi0
21分钟前
11
0
二项堆(三)之 Java的实现

概要 前面分别通过C和C++实现了二项堆,本章给出二项堆的Java版本。还是那句老话,三种实现的原理一样,择其一了解即可。 目录 1. 二项树的介绍 2. 二项堆的介绍 3. 二项堆的基本操作 4. 二项...

osc_ct8a6sdg
21分钟前
6
0
Windows 10 安装 Hadoop 2.10

  1. 配置JAVA_HOME环境和Hadoop环境:      2. 配置bin   3. 进入Hadoop中/etc/hadoop下     配置hdfs-site.xml增加:    <property> <!-- 单节点,所以配置成1 -->...

osc_jmtenr3d
22分钟前
18
0
如何让你在众多二手车中挑中满意的?python帮你实现(附源码)

前言 老司机带你去看车,网上的几千条的二手车数据,只需几十行代码,就可以统统获取,保存数据到我们本地电脑上 知识点: 1.python基础知识 2.函数 3.requests库 4.xpath适合零基础的同学 ...

osc_rmqoxylv
23分钟前
12
0
Selenium IDE使用指南三(控制流)

Selenium IDE附带的命令使您可以添加条件逻辑和循环到测试中。 这使您仅在满足应用程序中的某些条件时才执行命令(或一组命令),或根据预定义的标准重复执行命令。 JavaScript表达式 通过使...

分布式编程
23分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部