文档章节

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

ali安东尼
 ali安东尼
发布于 2017/09/11 14:59
字数 1742
阅读 15
收藏 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
广州
花花世界欢乐多/swoole-worker

swoole-worker 关于本项目 此项目是workerman(v3.4.5)的swoole移植版本,移除了对pcntl,libevent,event,ev扩展的依赖,转而使用swoole提供的swooleprocess和swooleevent,定时器采用swoole的s...

花花世界欢乐多
2017/08/15
0
0
重新定义PHP : swool

使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品。 Swoole底层内置了异步非阻塞、多线程的网络IO服务器。PHP程序员仅需处理事件回调即可,无需...

旋转木马-千里马
2015/12/29
386
0
PHP并发IO编程之路

并发IO问题一直是后端编程中的技术挑战,从最早的同步阻塞Fork进程,到多进程/多线程,到现在的异步IO、协程。PHP程序员因为有强大的LAMP框架,对底层方面的知识知之甚少,本文目的就是详细介...

snowing1990
2016/03/24
41
0
PHP并发IO编程之路

并发IO问 题一直是服务器端编程中的技术难题,从最早的同步阻塞直接Fork进程,到Worker进程池/线程池,到现在的异步IO、协程。PHP程序员因为有强大 的LAMP框架,对这类底层方面的知识知之甚少...

snowing1990
2016/07/07
59
0
swoole项目思维转换 -- 前篇

PHP是最好的语言,Swoole重新定义了最好的语言,这当然是个梗了,不过php做为一个入门低、开发快、执行效率高的一门语言,而在以快速著称的pc互联网时代,无可争议的成为首选,这是php的优势...

杨太化
2015/10/15
626
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

(一)软件测试专题——之Linux常用命令篇01

本文永久更新地址:https://my.oschina.net/bysu/blog/1931063 【若要到岸,请摇船:开源中国 不最醉不龟归】 Linux的历史之类的很多书籍都习惯把它的今生来世,祖宗十八代都扒出来,美其名曰...

不最醉不龟归
13分钟前
3
0
蚂蚁金服Java开发三面

8月20号晚上8点进行了蚂蚁金服Java开发岗的第三面,下面开始: 自我介绍(要求从实践过程以及技术背景角度着重介绍) 实习经历,说说你在公司实习所做的事情,学到了什么 关于你们的交易平台...

edwardGe
20分钟前
7
0
TypeScript基础入门 - 函数 - this(三)

转载 TypeScript基础入门 - 函数 - this(三) 项目实践仓库 https://github.com/durban89/typescript_demo.gittag: 1.2.4 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能...

durban
29分钟前
0
0
Spark core基础

Spark RDD的五大特性 RDD是由一系列的Partition组成的,如果Spark计算的数据是在HDFS上那么partition个数是与block数一致(大多数情况) RDD是有一系列的依赖关系,有利于Spark计算的容错 RDD中每...

张泽立
37分钟前
0
0
如何搭建Keepalived+Nginx+Tomcat高可用负载均衡架构

一.概述 初期的互联网企业由于业务量较小,所以一般单机部署,实现单点访问即可满足业务的需求,这也是最简单的部署方式,但是随着业务的不断扩大,系统的访问量逐渐的上升,单机部署的模式已...

Java大蜗牛
52分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部