有为青年总是在空闲的时候学习点知识。
TCP服务器的代码:
<?php $serv = new swoole_server('0.0.0.0',9502,SWOOLE_PROCESS,SWOOLE_SOCK_TCP); $serv->set([ 'work_num'=>4 ]); $serv->on('connect',function($serv,$fd){ //连接事件 }); $serv->on('receive',function($serv,$fd,$fromid,$data){ if(!empty($serv->connection_list())){ foreach($serv->connection_list() as $s ){ //不给自己发信息,只给其他的连接用户发 if($s != $fd){ //$data是客户端发送过来的信息 $serv ->send($s,$data,$fd); } } } }); $serv->on('close',function($serv,$fd){ //关闭事件 }); $serv->start();
客户端的代码(用Swoole定时器模拟持续的发送聊天信息,同时用不同的随机数区分不同的信息):
<?php //异步tcp客户端 $client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC); //连接服务端 $client->on("connect", function(swoole_client $cli) { //用随机数区分不同的信息 //下面用一个Swoole的定时器来模拟持续的发送聊天信息 swoole_timer_tick(3000,function()use($cli){ $code = rand(10000, 99999); $cli->send('测试情况'.$code); }); }); //接收到服务端发送的消息时触发的 $client->on('receive', function ($cli, $data) { //考虑粘包的问题 echo $data; }); $client->on('error', function ($cli) { }); //监听连接关闭事件,客服端关闭,或者服务器主动关闭 $client->on('close', function ($cli) { }); //先绑定事件之后随后建立连接,连接失败直接退出并打印错误码 $client->connect('127.0.0.1', 9502) || exit("connect failed. Error: {$client->errCode} ");
实验结果:
优化:设置心跳检测,粘包处理,配置服务器