PHP+swoole实现简单多人在线聊天群发


Posted in PHP onJanuary 19, 2016

由于本文的能力有限,有好多聊天逻辑的细节没有实现,只实现了群发,具体代码如下所示:

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> 
<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> 
<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>

推荐文章:php安装swoole扩展的方法    使用swoole扩展php websocket示例

以上代码给大家分享了PHP+swoole实现简单多人在线聊天群发的相关代码,希望本文所述对大家有所帮助。

PHP 相关文章推荐
提问的智慧(2)
Oct 09 PHP
PHPShop存在多个安全漏洞
Oct 09 PHP
用php实现的下载css文件中的图片的代码
Feb 08 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
Jun 04 PHP
PHP5中新增stdClass 内部保留类
Jun 13 PHP
利用PHP实现短域名互转
Jul 05 PHP
codeigniter显示所有脚本执行时间的方法
Mar 21 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
Apr 03 PHP
fckeditor上传文件按日期存放及重命名方法
May 22 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
PHP实现执行外部程序的方法详解
Aug 17 PHP
php基于Redis消息队列实现的消息推送的方法
Nov 28 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
Jan 19 #PHP
[原创]CI(CodeIgniter)简单统计访问人数实现方法
Jan 19 #PHP
PHP数组去重比较快的实现方式
Jan 19 #PHP
PHP保存session到memcache服务器的方法
Jan 19 #PHP
PHP mysql事务问题实例分析
Jan 18 #PHP
给PHP开发者的编程指南 第一部分降低复杂程度
Jan 18 #PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
Jan 15 #PHP
You might like
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
jquery实现树形二级菜单实例代码
2013/11/20 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
javascript实现根据身份证号读取相关信息
2014/12/17 Javascript
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
使用js画图之画切线
2015/01/12 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
详解Angular-cli生成组件修改css成less或sass的实例
2017/07/27 Javascript
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
在Vue项目中用fullcalendar制作日程表的示例代码
2019/08/04 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
跟老齐学Python之复习if语句
2014/10/02 Python
python修改字典内key对应值的方法
2015/07/11 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
Python Flask 搭建微信小程序后台详解
2019/05/06 Python
python求最大值最小值方法总结
2019/06/25 Python
python实现复制文件到指定目录
2019/10/16 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
python根据字典的键来删除元素的方法
2020/08/16 Python
Python如何急速下载第三方库详解
2020/11/02 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
日本航空官方网站:JAL
2019/06/19 全球购物
毕业生造价工程师求职信
2013/10/17 职场文书
办公室秘书自我鉴定
2014/01/18 职场文书
2014年党务公开实施方案
2014/02/27 职场文书
建筑工地门卫岗位职责
2014/04/30 职场文书
网络营销计划
2015/01/17 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
利用Python第三方库实现预测NBA比赛结果
2021/06/21 Python