zoukankan      html  css  js  c++  java
  • PHP+swoole实现聊天群发功能

    本篇文章主要介绍PHP+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>
    
    <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 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>
    

    总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

    以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处

  • 相关阅读:
    十五天精通WCF——第六天 你必须要了解的3种通信模式
    十五天精通WCF——第五天 你需要了解的三个小技巧
    十五天精通WCF——第四天 你一定要明白的通信单元Message
    十五天精通WCF——第三天 client如何知道server提供的功能清单
    十五天精通WCF——第二天 告别烦恼的config配置
    十五天精通WCF——第一天 三种Binding让你KO80%的业务
    SimpleAdapter & BaseAdapter
    android:layout_gravity和android:gravity的区别
    Restrict & Cascade
    正确理解Mysql的列索引和多列索引
  • 原文地址:https://www.cnblogs.com/a609251438/p/12127505.html
Copyright © 2011-2022 走看看