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 相关文章推荐
PHP4实际应用经验篇(1)
Oct 09 PHP
php连接数据库代码应用分析
May 29 PHP
php 注释规范
Mar 29 PHP
解析php 版获取重定向后的地址(代码)
Jun 26 PHP
destoon实现首页显示供应、企业、资讯条数的方法
Jul 15 PHP
phplot生成图片类用法详解
Jan 06 PHP
Yii2中使用asset压缩js,css文件的方法
Nov 24 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 PHP
Laravel框架中自定义模板指令总结
Dec 17 PHP
PHP PDOStatement::fetchObject讲解
Feb 01 PHP
php多进程应用场景实例详解
Jul 22 PHP
如何在PHP环境中使用ProtoBuf数据格式
Jun 19 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
德生H-501的评价与改造
2021/03/02 无线电
Oracle 常见问题解答
2006/10/09 PHP
PHP全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
IE6中使用position导致页面变形的解决方案(js代码)
2011/01/09 Javascript
一个实用的图片切换支持点击切换和自动轮播
2014/09/09 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
AngularJS单选框及多选框实现双向动态绑定
2016/01/13 Javascript
bootstrap是什么_动力节点Java学院整理
2017/07/14 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
Vue.js中使用iView日期选择器并设置开始时间结束时间校验功能
2018/08/12 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
Python中用memcached来减少数据库查询次数的教程
2015/04/07 Python
介绍Python中几个常用的类方法
2015/04/08 Python
python如何查看系统网络流量的信息
2016/09/12 Python
Python判断某个用户对某个文件的权限
2016/10/13 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
django Serializer序列化使用方法详解
2018/10/16 Python
python爬虫模块URL管理器模块用法解析
2020/02/03 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
广告传媒专业应届生求职信
2014/03/01 职场文书
宣传活动总结范文
2014/07/01 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
高中生旷课检讨书
2014/10/08 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
行政申诉状范文
2015/05/20 职场文书
MySQL开启事务的方式
2021/06/26 MySQL