zoukankan      html  css  js  c++  java
  • 基于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}
    ");

    实验结果:

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

  • 相关阅读:
    .NET常见问题收集
    .NET 常用转换
    Android 百度地图开发setOnTouchListener方法给mapView设置了OnTouchListener后地图无法拖动的问题
    Android_参考
    常用操作
    Android开发笔记——Eclipse 关联Android源码
    Android开发笔记静态变量问题
    无法载入 mysql 扩展,<br />请检查 PHP 配置 解决办法
    服务器维护
    cocos2d 左下角三行
  • 原文地址:https://www.cnblogs.com/zhengweizhao/p/9675020.html
Copyright © 2011-2022 走看看