zoukankan      html  css  js  c++  java
  • swoole多人聊天室

    <?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;
    }
    <!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>
    </head>
    <body>
        <h2>WebSocket Test</h2>
        昵称:<input type="text" id="name" size="5" value="游客"/> <input type="text" id="content">
        <button onclick="speak_to_all()">发送</button>
        <br/><br/>
        <textarea id="message" style="overflow-x:hidden" rows="10" cols="50"></textarea>
        <p id="output"></p>
    </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+"
    ";
            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>
  • 相关阅读:
    Linux_文件权限
    离殇
    Oracle数据库软件标准版的一个限制:仅仅能用一个rman channel
    数据结构和算法设计专题之---推断两个链表是否相交并找出交点
    Test for Job (poj 3249 记忆化搜索)
    表达式求值
    HDOJ 2196 Computer 树的直径
    ListView的position的保持
    Django訪问量和页面PV数统计
    【oracle 11G Grid 】Crsctl start cluster 和 crsctl start crs 有差别么?
  • 原文地址:https://www.cnblogs.com/dawuge/p/12770637.html
Copyright © 2011-2022 走看看