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

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

以上内容希望帮助到大家,很多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. Golang redis 学习指南

    安装 我使用的是 https://github.com/go-redis/r... 这个 golang 客户端, 因此安装方式如下: go get gopkg.in/redis.v4 接着在代码中导入 ...

  2. comsol日常联系

  3. Redis学习笔记(一)配置文件参数说明

    1.Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2.当redis以守护进程方式运行时,Redis默认会把pid写入/var/run/ ...

  4. Web基础了解版09-Cookie-Session

    Cookie Cookie 是一种服务器发送给浏览器以键值对形式存储小量信息的技术. 当浏览器首次请求服务器时,服务器会将一条信息封装成一个Cookie发送给浏览器,浏览器收到Cookie,会将它保存 ...

  5. JavaScript - 运行机制,作用域,作用域链(Scope chain)

    参考 https://www.jianshu.com/p/3b5f0cb59344 https://jingyan.baidu.com/article/4f34706e18745be386b56d46 ...

  6. word2vec生成后缀名model文件处理

    引入from gensim.models import word2vec 读取test02.model里面的词· model = word2vec.Word2Vec.load('test02.mode ...

  7. UIImage点九图(让image不变形、只拉伸中间部分)

    建议写成UIImage的分类,如下 .h //保证图片拉伸不变形 - (UIImage *)resizingImageState; .m //保证图片拉伸不变形 - (UIImage *)resizi ...

  8. PAT T1005 Programming Pattern

    建立后缀数组,遍历height数组找到连续大于len的最长子序列~ #include<bits/stdc++.h> using namespace std; ; char s[maxn]; ...

  9. Struts2报错异常Method "setUser" failed for object com.mikey.action.ConverterAction@dd34285

    在写类型转换的时候发现报错 异常信息 ognl.MethodFailedException: Method "setUser" failed for object com.mike ...

  10. 让eclipse恢复默认布局

    参考:https://blog.csdn.net/howlaa/article/details/39178359 Window -> Perspective -> Reset Perspe ...