dmz社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6981|回复: 92

php使用swoole实现一个简单的多人在线聊天群发

  [复制链接]
  • TA的每日心情

    2024-11-19 20:46
  • 签到天数: 244 天

    [LV.8]以坛为家I

    4434

    主题

    1459

    帖子

    1万

    积分

    会|员

    Rank: 9Rank: 9Rank: 9

    积分
    10734
    发表于 2019-1-2 11:00:03 | 显示全部楼层 |阅读模式

    本站资源全部免费,回复即可查看下载地址!

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    聊天逻辑的好多细节没有实现,只实现群发。
    php代码:
    [PHP] 纯文本查看 复制代码
    $serv = new swoole_websocket_server("127.0.0.1",3999);
     
    //服务的基本设置
    $serv->set(array(
            'worker_num' => 2,
            'reactor_num'=>8,
            'task_worker_num'=>1,
            'dispatch_mode' => 2,
            'debug_mode'=> 1,
            'daemonize' => true,
            'log_file' => __DIR__.'/log/webs_swoole.log',
            'heartbeat_check_interval' => 60,
            'heartbeat_idle_time' => 600,
    ));
     
    $serv->on('connect', function ($serv,$fd){
    //  echo "client:$fd Connect.".PHP_EOL;
    });
     
    //测试receive
    $serv->on("receive",function(swoole_server $serv,$fd,$from_id,$data){
    //  echo "receive#{$from_id}: receive $data ".PHP_EOL;
    });
     
    $serv->on('open', function($server, $req) {
    //  echo "server#{$server->worker_pid}: handshake success with fd#{$req->fd}".PHP_EOL;;
    //  echo PHP_EOL;
    });
     
    $serv->on('message',function($server,$frame) {
    //  echo "message: ".$frame->data.PHP_EOL;
        $msg=json_decode($frame->data,true);
        switch ($msg['type']){
            case 'login':
                $server->push($frame->fd,"欢迎欢迎~");
                break;
            default:
                break;
        }
        $msg['fd']=$frame->fd;
        $server->task($msg);
    });
     
    $serv->on("workerstart",function($server,$workerid){
    //  echo "workerstart: ".$workerid.PHP_EOL;
    //  echo PHP_EOL;
    });
     
    $serv->on("task","on_task");
    $serv->on("finish",function($serv,$task_id,$data){
        return ;
    });
    $serv->on('close', function($server,$fd,$from_id) {
    //  echo "connection close: ".$fd.PHP_EOL;
    //  echo PHP_EOL;
    });
     
    $serv->start();
    function on_task($serv,$task_id,$from_id,$data) {
        switch ($data['type']){
            case 'login':
                $send_msg="说:我来了~";
                break;
            default:
                $send_msg="说:{$data['msg']['speak']}";
                break;
        }
        foreach ($serv->connections as $conn){
            if ($conn!=$data['fd']){
                if (strpos($data['msg']['name'],"游客")===0){
                    $name=$data['msg']['name']."_".$data['fd'];
                }else{
                    $name=$data['msg']['name'];
                }
            }else{
                $name="我";
            }
            $serv->push($conn,$name.$send_msg);
        }
        return;
    }
     
    function on_finish($serv,$task_id,$data){
        return true;
    }

    前端代码:
    [HTML] 纯文本查看 复制代码
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>WebSocket测试</title>
    <script language="javascript"type="text/javascript" src="jquery-1.12.0.min.js">
    </script>
    </head>
     
    <body>
    <h2>WebSocket Test</h2> 
    昵称:<input type="text" id="name" size="5" value="游客"/>     <input type="text" id="content">
    <button>发送</button>
    <br/><br/>
    <textarea id="message" style="overflow-x:hidden" rows="10" cols="50"></textarea>
    <div id="output"></div>
    </body>
     
    <script language="javascript"type="text/javascript"> 
        var wsUri ="ws://127.0.0.1:3999/";
        var output; 
        function init() {
            output = document.getElementById("output");
            testWebSocket();
        }
        function testWebSocket() {
            websocket = new WebSocket(wsUri);
            websocket.onopen = function(evt) {
                onOpen(evt)
            };
            websocket.onclose = function(evt) {
                onClose(evt)
            };
            websocket.onmessage = function(evt) {
                onMessage(evt)
            };
            websocket.onerror = function(evt) {
                onError(evt)
            };
        }
        function get_speak_msg(){
            var name=document.getElementById("name").value;
            var speak=document.getElementById("content").value;
            var json_msg='{"name":"'+name+'","speak":\"'+speak+'"}';
            return json_msg;
        }
             
        function pack_msg(type,msg){
            return '{"type":"'+type+'","msg":'+msg+'}';
        }
             
        function onOpen(evt) {
            append_speak("已经联通服务器.........");
            speak_msg=get_speak_msg();
            send_msg=pack_msg("login",speak_msg);
            doSend(send_msg);
        }
         
        function onClose(evt) {
            append_speak("俺老孙去也!");
        }
             
        function onMessage(evt) {
            append_speak(evt.data);
        }
             
        function onError(evt) {
            alert(evt.data);
        }
         
        function doSend(message) {
            websocket.send(message);
        }
         
        function append_speak(new_msg){
            document.getElementById("message").value=document.getElementById("message").value+new_msg+"\n";
            document.getElementById('message').scrollTop = document.getElementById('message').scrollHeight;
        }
         
        function speak_to_all(){
            send_msg=pack_msg("speak",get_speak_msg());
            if(document.getElementById("content").value==""){
                return;
            }
            doSend(send_msg);
            document.getElementById("content").value="";
        }
        init();
    </script>
    </html>

    如果看了代码还是不懂可以观看以下基础到实战视频教程:
    EasySwoole+ElasticSearch打造高性能小视频服务系统:https://www.456jz.com/thread-7423-1-1.html
    Swoole入门到实战打造高性能赛事直播平台:https://www.456jz.com/thread-2402-1-1.html

    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    7561

    帖子

    1054

    积分

    技冠群雄

    Rank: 6Rank: 6

    积分
    1054

    发表于 2019-1-2 11:18:22 | 显示全部楼层
    么有分,谁能送我点积分啊::>_<::
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    35

    主题

    7850

    帖子

    1098

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1098

    发表于 2019-1-3 10:59:11 | 显示全部楼层
    学习了,不错,讲的太有道理了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    3452

    帖子

    10

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    10

    发表于 2019-1-3 15:31:46 | 显示全部楼层
    有竞争才有进步嘛
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    3520

    帖子

    -8

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    -8

    发表于 2019-1-3 17:20:52 | 显示全部楼层
    路过,学习下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    23

    主题

    7985

    帖子

    1042

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1042

    发表于 2019-1-3 22:56:54 | 显示全部楼层
    我是来刷分的,嘿嘿
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    3461

    帖子

    2

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    2

    发表于 2019-1-5 13:39:42 | 显示全部楼层
    过来看看的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    29

    主题

    7878

    帖子

    1075

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    1075

    发表于 2019-1-5 13:48:14 | 显示全部楼层
    这是什么东东啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    3415

    帖子

    6

    积分

    终身会员[A]

    Rank: 7Rank: 7Rank: 7

    积分
    6

    发表于 2019-1-5 15:05:18 | 显示全部楼层
    正需要,支持楼主大人了!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2023-10-6 13:54
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    32

    主题

    7792

    帖子

    1135

    积分

    荣誉会员

    积分
    1135

    发表于 2019-1-7 23:58:55 | 显示全部楼层
    看帖回帖是美德!:lol
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|小黑屋|本站代理|dmz社区

    GMT+8, 2024-12-23 16:04 , Processed in 0.636040 second(s), 42 queries .

    Powered by Discuz! X3.4 Licensed

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表