实现目标:
tcp客户端实现与swoole搭建的tcp服务端通信传输数据,客户端请求提交数据,服务端接收数据存入数据库及对数据库查询结果返回给tcp客户端
php swoole wiki参考文档地址
https://wiki.swoole.com/#/start/start_tcp_server
用到的模拟工具:sockettool
首先理解以下TCP工作的原理
TCP的“三次握手”
TCP的三次握手可以确保服务器和客户端之间可以正常通信。三次握手的过程:至于这个过程的解释,可以点击下面的链接来查看。
参考:https://blog.csdn.net/Loli_Tio/article/details/79374401
IP和PORT
服务器需要有一个IP,TCP通信时,还需要提供一个端口号。
客户端需要有一个IP,TCP通信时,也需要提供一个端口号。
个人理解:IP就是地址,可以理解为一个房子,当你需要建立通信的时候,首先肯定得相互知道这个房子在哪里才可以吧,要不然我们得信息发送到哪里呢?
PORT端口,端口号可以理解为这个房子的一个门,我们需要指定一个门,将消息从这个门里面传送进去或者从这个门接受消息。
php swoole 扩展的安装
参考:https://wiki.swoole.com/#/environment
启动服务器:
<?php
/*
* $host : 监听ip地址
* 本地地址设置为:127.0.0.1
* 外网ip:192.168.12.10
* 监听多个ip地址设置为:0.0.0.0(监听的是ipv4)ipv6自行去官网查询用法
* $port : 端口号
* 设置为1024以下的端口号需要root权限
* $mode : SWOOLE_PROCESS 多进程的方式
* $socke_type : SWOOLE_SOCK_TCP
*
* */
//创建一个服务器
$host = '0.0.0.0';//string
$port = 9502;//int
//$serv = new swoole_server($host,$port,$mode,$socke_type);
//$serv = new swoole_server($host,$port);
$serv = new Swoole\Server($host,$port);
//使用服务
/*
* bool $swoole_server->on(string $event,mixid $callback);
* $event:
* connect : 当建立连接时 $server :服务器信息 $fd :客户端信息
* receive : 当接收数据时 $serv服务器信息$fd客户端信息$from_id:ID $data:数据
* close : 当关闭连接时 $serv服务器信息$fd客户端信息
* */
$serv->set([
//'open_eof_check' => true,
//'open_eof_split' => true,
//'package_eof' => "~",
//'open_length_check' => true,
//'package_max_length' => 8192000000000000000,
//'package_length_type' => 'N',
//'package_length_offset' => 4,
//'package_body_offset' => 0
]);
$serv->on('connect',function($serv,$fd){
//可以打印一下
//var_dump($serv);
//var_dump($fd);
echo $fd.":建立连接\n";
$serv->send($fd,"welcome!");
});
$serv->on('receive',function($serv,$fd,$from_id,$data){
echo "接收到数据\n";
//var_dump($fd);
//echo $data;
//$buffer = str_split(bin2hex($data),2);
//var_dump($buffer);
//我们通过tcp接收到的数据是ASCII码二进制字符串,这里转化成十六进制我们对接接口进行对应的处理转化信息处理
$buffer = bin2hex($data);//二进制转化为十六进制
echo $buffer;
$get_str = str_replace(" ","",$buffer);
//$result = pack("H*", $send_str);//将十六进制命令包组合成二进制包
//$serv->send($fd, $result);
//$str = pack("H*",$data);
//var_dump($str);
//var_dump(bin2hex($data));
//$buffer = str_split(bin2hex($data),2);
//var_dump($buffer);
//echo "#{$serv->worker_id}>> received length=" . strlen($data) . "\n";
//$serv->send($fd, $data);
//$serv->send($fd,"aaa");
});
$serv->on('close',function($serv,$fd){
echo "关闭连接\n";
});
//开启tcp服务器
$serv->start();
//将文件上传到搭建好的swoole服务器
//执行php tcp.php启动服务器
//查看tcp服务器是否正常运行命令:ps -ajft
//用网络调试工具测试是否正常
//注意关闭防火墙,确认tcp服务器开启成功
保存好文件就可以执行:php tcp.php启动服务器了
然后用工具模拟创建tcp客户端(测试好9502端口是否打开,或者关闭防火墙)
可以模拟字符串的传输或者十六进制数据的传输。就可以进行对应的数据传输了。。。。。。
本次开发的疑惑点:
1、TCP传输的数据格式十六进制,接收到数据是ASCII码对应的二进制字符串
2、TCP服务器给客户端传输的数据也是要把十六进制打包(pack)成二进制ASCII码对应的字符串格式,参考pack()函数的用法
3、测试工具模拟发送十六进制的数据格式不要带空格例如:
7e0e9be09c0031020200000178588f2f1000013436303030353934343130373535340000000000000000000001785893a5a27e