Swoole 网络通信协议,固定包头。
网络通信过程中,可能会出现分包和合包的情况。具体情况如https://wiki.swoole.com/wiki/page/484.html文档所讲的。这里测试了下固定包头的协议。示例代码如下
1.解包封装的方法
communicationPack.php
<?php
//对数据信息封装
function packData($sendData,$packModel){
return pack($packModel, strlen($sendData)).$sendData;
} //解包
function unpackData($rcvData,$packModel){
$length = $packModel=='N'?4:2;
return substr($rcvData,$length);
}
2.服务端 tcpServer.php
<?php
require_once 'communicationPack.php';
$packModel = 'N';
//创建Server对象,监听 127.0.0.1:9501端口
$serv = new swoole_server("127.0.0.1", 9501);
$serv->set(array(
'open_length_check' => true,
'package_max_length' => 2000000,
'package_length_type' => $packModel, //see php pack()
'package_length_offset' => 0,
'package_body_offset' => $packModel=='N'?4:2,
));
//监听连接进入事件
$serv->on('connect', function ($serv, $fd) {
echo "Client: Connect.\n";
}); //监听数据接收事件
$serv->on('receive', function ($serv, $fd, $from_id, $data) use($packModel){
echo "#{$serv->worker_id}>> received length=" . strlen($data) ."data=".$data. "}\n";
$data = unpackData($data,$packModel);
$returnStr = "Server: ".$data;
$serv->send($fd, packData($returnStr,$packModel));
}); //监听连接关闭事件
$serv->on('close', function ($serv, $fd) {
echo "Client: Close.\n";
}); //启动服务器
$serv->start();
启动服务端

3 客户端 tcpClient.php
<?php
require_once 'communicationPack.php';
$packModel = 'N';
$client = new swoole_client(SWOOLE_SOCK_TCP);
$client->set(array(
'open_length_check' => true,
'package_length_type' => $packModel,
'package_length_offset' => 0, //第N个字节是包长度的值
'package_body_offset' => $packModel=='N'?4:2, //第几个字节开始计算长度
'package_max_length' => 2000000, //协议最大长度
));
//连接到服务器
if (!$client->connect('127.0.0.1', 9501, 0.5))
{
die("connect failed.");
}
//向服务器发送数据
//数据协议
$sendData = "test123";
$sendData = packData($sendData,$packModel);
if (!$client->send($sendData))
{
die("send failed.");
}
//从服务器接收数据
$data = $client->recv();
if (!$data)
{ die("recv failed.");
}
echo unpackData($data,$packModel);
//关闭连接
$client->close();
然后启动客户端

服务端会打印

pack N是将数据转成了无符号32位的数字,这个刚好长度是4个字节,所以设定
package_body_offset=4
Swoole 网络通信协议,固定包头。的更多相关文章
- day27 网络通信协议 tcp/udp区别
今日主要内容: 一.网络通信协议 二.tcp udp协议下的socket 一.网络通信协议 1.1互联网的本质就是一系列的网络协议 本机IP地址('127.0.0.1',xxxx) 互联网连接的电脑互 ...
- 第二十七天- 网络通信协议 TCP UDP 缓冲区
1.网络通信协议 osi七层模型:按照分工不同把互联网协议从逻辑上划分了层级 socket层 2.理解socket: Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计 ...
- Java网络通信协议、UDP、TCP类加载整理
网络通信协议 网络通信协议 网络通信协议有很多种,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal传输控制协议/英特网互 ...
- 网络通信协议tcp,udp区别
1 网络通信协议 Tcp udp的区别 重点(*****) Tcp三次握手四次挥手(******) udp客户端多人聊天 import socket udp_client = socket.socke ...
- 网络通信协议六之IP地址和MAC地址特征分析
逻辑地址和物理地址 >>逻辑地址:工作在网络层,也叫IP地址,①具有全局唯一性②用软件实现③32位 10.1.0.6 -——>00001010.00000001.00000000.0 ...
- 网络通信协议简介(TCP与UDP)
通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规则被称为网络通 ...
- Java第三阶段学习(八:网络通信协议、UDP与TCP协议)
一.网络通信协议 1.概念: 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传 ...
- JAVA基础之网络通信协议--TCP与UDP
个人理解: 了解区分UDP与TCP的不同,正常情况都是两者结合的使用模式!为了更好的传输,经常会开多线程进行传输的! 一.网络通信协议: 1.TCP/IP协议: 四层:应用层.传输层.网络层和链路层: ...
- java基础(31):网络通信协议、UDP、TCP
1. 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通 ...
随机推荐
- Win10和Ubuntu双系统搭建详
最近学习云计算时,需要搭建xen和Hadoop,虚拟机容易出很多问题所以搭建了双系统,也方便以后的学习. 下面是详细搭建过程: 准备材料: U盘(容量>8G,最好是3.0接口速度快).Ultra ...
- Flink安装部署
官网:https://ci.apache.org/projects/flink/flink-docs-release-1.7/ops/deployment/cluster_setup.html cd ...
- django rest framework serializer中获取request中user方法
views.py serializer = self.get_serializer(data=request.data, context={'request': request}) seriali ...
- Python全栈开发记录_第七篇(模块_time_datetime_random_os_sys_hashlib_logging_configparser_re)
这一篇主要是学习python里面的模块,篇幅可能会比较长 模块的概念:在Python中,一个.py文件就称之为一个模块(Module). 模块一共三种: python标准库 第三方模块 应用程序自定义 ...
- springboot学习二:配置文件配置
springboot默认读取application*.properties #######spring配置####### spring.profiles.active=dev //引入开发配置文件 a ...
- 直达核心的快速学习PHP入门技巧
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,是目前最火的 ...
- loadrunner代理录制脚本
1.打开loadrunner录制脚本选项: 2.start recording弹窗选择options: 3.设置loadrunner端口,可自定义:后面的浏览器设置代理需要用到此处设置的端口号: 4 ...
- python练习题_04
import os def fetch(data): # print('\033[1;43m这是查询功能\033[0m') # print('\033[1;43m用户数据是\033[0m',data) ...
- Django04-模板系统Template
一.模板支持的语法 Django模板中只需要记两种特殊符号: {{ }}表示变量,在模板渲染的时候替换成值{% %}表示逻辑相关的操作. 二. 变量(使用双大括号来引用变量) 1.语法格式:{{var ...
- Tinker热修复
集成buggly热修复的时候报错 Error:A problem occurred configuring project ‘:app’. Failed to notify project evalu ...