基于Swoole 的TCP实现简单群聊天室

有为青年总是在空闲的时候学习点知识。

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}\n");

实验结果:

优化:设置心跳检测,粘包处理,配置服务器

 

posted @ 2018-09-19 15:53  阿鸠  阅读(419)  评论(0编辑  收藏  举报