本篇文章主要介绍PHP+swoole实现聊天群发功能,感兴趣的朋友参考下,希望对大家有所帮助。

php代码:

  1. $serv = new swoole_websocket_server("127.0.0.1",3999);
  2. //服务的基本设置
  3. $serv->set(array(
  4. 'worker_num' => 2,
  5. 'reactor_num'=>8,
  6. 'task_worker_num'=>1,
  7. 'dispatch_mode' => 2,
  8. 'debug_mode'=> 1,
  9. 'daemonize' => true,
  10. 'log_file' => __DIR__.'/log/webs_swoole.log',
  11. 'heartbeat_check_interval' => 60,
  12. 'heartbeat_idle_time' => 600,
  13. ));
  14. $serv->on('connect', function ($serv,$fd){
  15. // echo "client:$fd Connect.".PHP_EOL;
  16. });
  17. //测试receive
  18. $serv->on("receive",function(swoole_server $serv,$fd,$from_id,$data){
  19. // echo "receive#{$from_id}: receive $data ".PHP_EOL;
  20. });
  21. $serv->on('open', function($server, $req) {
  22. // echo "server#{$server->worker_pid}: handshake success with fd#{$req->fd}".PHP_EOL;;
  23. // echo PHP_EOL;
  24. });
  25. $serv->on('message',function($server,$frame) {
  26. // echo "message: ".$frame->data.PHP_EOL;
  27. $msg=json_decode($frame->data,true);
  28. switch ($msg['type']){
  29. case 'login':
  30. $server->push($frame->fd,"欢迎欢迎~");
  31. break;
  32. default:
  33. break;
  34. }
  35. $msg['fd']=$frame->fd;
  36. $server->task($msg);
  37. });
  38. $serv->on("workerstart",function($server,$workerid){
  39. // echo "workerstart: ".$workerid.PHP_EOL;
  40. // echo PHP_EOL;
  41. });
  42. $serv->on("task","on_task");
  43. $serv->on("finish",function($serv,$task_id,$data){
  44. return ;
  45. });
  46. $serv->on('close', function($server,$fd,$from_id) {
  47. // echo "connection close: ".$fd.PHP_EOL;
  48. // echo PHP_EOL;
  49. });
  50. $serv->start();
  51. function on_task($serv,$task_id,$from_id,$data) {
  52. switch ($data['type']){
  53. case 'login':
  54. $send_msg="说:我来了~";
  55. break;
  56. default:
  57. $send_msg="说:{$data['msg']['speak']}";
  58. break;
  59. }
  60. foreach ($serv->connections as $conn){
  61. if ($conn!=$data['fd']){
  62. if (strpos($data['msg']['name'],"游客")===0){
  63. $name=$data['msg']['name']."_".$data['fd'];
  64. }else{
  65. $name=$data['msg']['name'];
  66. }
  67. }else{
  68. $name="我";
  69. }
  70. $serv->push($conn,$name.$send_msg);
  71. }
  72. return;
  73. }
  74. function on_finish($serv,$task_id,$data){
  75. return true;
  76. }

前端代码:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  5. <title>WebSocket测试</title>
  6. <script language="javascript"type="text/javascript" src="jquery-1.12.0.min.js">
  7. </script>
  8. </head>
  9. <body>
  10. <h2>WebSocket Test</h2>
  11. 昵称:<input type="text" id="name" size="5" value="游客"/> <input type="text" id="content">
  12. <button onclick="speak_to_all()">发送</button>
  13. <br/><br/>
  14. <textarea id="message" style="overflow-x:hidden" rows="10" cols="50"></textarea>
  15. <p id="output"></p>
  16. </body>
  17. <script language="javascript"type="text/javascript">
  18. var wsUri ="ws://127.0.0.1:3999/";
  19. var output;
  20. function init() {
  21. output = document.getElementById("output");
  22. testWebSocket();
  23. }
  24. function testWebSocket() {
  25. websocket = new WebSocket(wsUri);
  26. websocket.onopen = function(evt) {
  27. onOpen(evt)
  28. };
  29. websocket.onclose = function(evt) {
  30. onClose(evt)
  31. };
  32. websocket.onmessage = function(evt) {
  33. onMessage(evt)
  34. };
  35. websocket.onerror = function(evt) {
  36. onError(evt)
  37. };
  38. }
  39. function get_speak_msg(){
  40. var name=document.getElementById("name").value;
  41. var speak=document.getElementById("content").value;
  42. var json_msg='{"name":"'+name+'","speak":\"'+speak+'"}';
  43. return json_msg;
  44. }
  45. function pack_msg(type,msg){
  46. return '{"type":"'+type+'","msg":'+msg+'}';
  47. }
  48. function onOpen(evt) {
  49. append_speak("已经联通服务器.........");
  50. speak_msg=get_speak_msg();
  51. send_msg=pack_msg("login",speak_msg);
  52. doSend(send_msg);
  53. }
  54. function onClose(evt) {
  55. append_speak("俺老孙去也!");
  56. }
  57. function onMessage(evt) {
  58. append_speak(evt.data);
  59. }
  60. function onError(evt) {
  61. alert(evt.data);
  62. }
  63. function doSend(message) {
  64. websocket.send(message);
  65. }
  66. function append_speak(new_msg){
  67. document.getElementById("message").value=document.getElementById("message").value+new_msg+"\n";
  68. document.getElementById('message').scrollTop = document.getElementById('message').scrollHeight;
  69. }
  70. function speak_to_all(){
  71. send_msg=pack_msg("speak",get_speak_msg());
  72. if(document.getElementById("content").value==""){
  73. return;
  74. }
  75. doSend(send_msg);
  76. document.getElementById("content").value="";
  77. }
  78. init();
  79. </script>
  80. </html>

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

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

PHP+swoole实现聊天群发功能的更多相关文章

  1. 【WebSocket No.2】WebSocket和Socket实现聊天群发

    介绍: 前面写过一篇简单的websocke实现服务端.这一篇就不在说什么基础的东西主要是来用实例说话,主要是讲一下实现单聊和群组聊天和所有群发的思路设计. 直接不懂的可以看一下上一篇简单版本再来看也行 ...

  2. Netty学习笔记(四) 简单的聊天室功能之服务端开发

    前面三个章节,我们使用了Netty实现了DISCARD丢弃服务和回复以及自定义编码解码,这篇博客,我们要用Netty实现简单的聊天室功能. Ps: 突然想起来大学里面有个课程实训,给予UDP还是TCP ...

  3. 使用epoll实现聊天室功能,同时比较epoll和select的异同

    1.首先介绍一下select和epoll的异同,如下(摘抄自https://www.cnblogs.com/Anker/p/3265058.html) select的几大缺点: (1)每次调用sele ...

  4. 【JEECG技术文档】JEECG在线聊天插件功能集成文档

    原文地址:http://jeecg.iteye.com/blog/2320670 JEECG在线聊天插件功能集成文档 前提: 采用jeecg_3.6.3版本以上(Maven工程) 插件项目: 在线聊天 ...

  5. [Python] socket发送UDP广播实现聊天室功能

    一.说明 本文主要使用socket.socket发送UDP广播来实现聊天室功能. 重点难点:理解UDP通讯流程.多线程.UDP广播收发等. 测试环境:Win10\Python3.5. 程序基本流程:创 ...

  6. 黑科技!仅需 3 行代码,就能将 Gitter 集成到个人网站中,实现一个 IM 即时通讯聊天室功能?

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

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

    聊天逻辑的好多细节没有实现,只实现群发. php代码: $serv = new swoole_websocket_server("127.0.0.1",3999); //服务的基本 ...

  8. 基于swoole的聊天室模型

    client.html: <!doctype html><html><head> <meta charset="utf-8"> &l ...

  9. SignalR实现在线聊天室功能

    一.在线聊天室 1.新建解决方案 SignalROnlineChatDemo 2.新建MVC项目 SignalROnlineChatDemo.Web (无身份验证) 3.安装SignalR PM> ...

随机推荐

  1. spark sql 访问mysql数据库

    pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-ja ...

  2. 什么是Rogue Histogram?

    Rogue Histogram可以理解为AP的“流氓直方图”,这里大概记录了该AP附近的其他AP的信道和频宽. 例如如下图:可以通过show ap auto-rf 802.11a AP-name / ...

  3. 2019年7月22日A股科创板开板首日行情思考

    2019年7月22日A股科创板开板首日行情思考 原因:2019科创板开板交易 盘面:科创板交易活跃,首批上市25只股票大涨,最高达5倍涨幅:主板交投低迷,量能萎缩,大部分股票下跌. 操作:加仓 西安银 ...

  4. ANSYS布尔运算APDL

    目录 1.交运算 2.加运算 3.减运算 4.分割 5. 搭接 6. 互分 6.粘结 1.交运算 交运算的结果是由每个初始图元的共同部分,形成一个新的图元. 命令 功能 备注 LINL 线与线的交 A ...

  5. netty代理http&https请求

    (1)关键代码 package test; import java.security.cert.CertificateException; import javax.net.ssl.SSLExcept ...

  6. 科幻电影免费百度云分享(Scince-fiction cloud share)

    Marvel episode Link  Passcode:6h9k Star War full episode Link Passcode:7abk Men In Black Episode Col ...

  7. Python3.5学习之旅——day4

    本节内容 1.装饰器 2.迭代器与生成器 3.内置方法 4.软件目录结构规范 一.装饰器 装饰器是一个用来装饰其他函数的工具,即为其他函数添加附加功能,其本质就是函数. 装饰器需要遵循的以下两个原则: ...

  8. 关于window.location.href页面跳转的坑

    "window.location.href"."location.href"是本页面跳转 "parent.location.href"是上一 ...

  9. mapreduce程序执行过程

    1.客户端程序,设置作业相关的配置和计算输入分片信息,向RM获取一个JOBID,提交作业信息(分片)到以作业ID为目录下,通知APP——MASTER 2.APP——MASTER,读取指定目录下的作业信 ...

  10. linux 删除 复制 移动

    Linux文件类型 - 普通文件 d 目录文件 b 块设备 c 字符设备 l 符号链接文件 p 管道文件pipe s 套接字文件socket 基名:basename 目录名:dirname basen ...