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 相关文章推荐
PHP学习资料汇总与网址
Mar 16 PHP
PHP 采集获取指定网址的内容
Jan 05 PHP
yii上传文件或图片实例
Apr 01 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
Apr 24 PHP
php通过记录IP来防止表单重复提交方法分析
Dec 16 PHP
php随机抽奖实例分析
Mar 04 PHP
php带抄送和密件抄送的邮件发送方法
Mar 20 PHP
微信获取用户地理位置信息的原理与步骤
Nov 12 PHP
smarty的section嵌套循环用法示例
May 28 PHP
PHP多进程编程之僵尸进程问题的理解
Oct 15 PHP
PHPExcel 修改已存在Excel的方法
May 03 PHP
wordpress自定义标签云与随机获取标签的方法详解
Mar 22 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
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
2019/10/11 PHP
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
js实现checkbox全选、不选与反选的方法
2015/02/09 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
jquery dataTable 后台加载数据并分页实例代码
2017/06/07 jQuery
JS解析url查询参数的简单代码
2017/08/06 Javascript
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
深入解析koa之中间件流程控制
2019/06/17 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
python从sqlite读取并显示数据的方法
2015/05/08 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
python获取代理IP的实例分享
2018/05/07 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
Keras使用ImageNet上预训练的模型方式
2020/05/23 Python
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
内科护士实习自我鉴定
2013/10/17 职场文书
军校大学生个人的自我评价
2014/02/17 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
保护环境演讲稿
2014/05/10 职场文书
农村党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
学校2015年纠风工作总结
2015/05/15 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书