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 gbk环境下json_dencode传送来的汉字
Nov 13 PHP
解析zend studio中直接导入svn中的项目的方法步骤
Jun 21 PHP
PHP实现无限极分类图文教程
Nov 25 PHP
基于JQuery+PHP编写砸金蛋中奖程序
Sep 08 PHP
php使用正则表达式去掉html中的注释方法
Nov 03 PHP
smarty模板数学运算示例
Dec 11 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
Mar 14 PHP
php动态读取数据清除最右边距的方法
Apr 12 PHP
PHP编程获取各个时间段具体时间的方法
May 26 PHP
PHP实现正则表达式分组捕获操作示例
Feb 03 PHP
PHP利用curl发送HTTP请求的实例代码
Jul 09 PHP
PHP7移除的扩展和SAPI
Mar 09 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开发注意事项总结
2015/02/04 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
学习PHP Cookie处理函数
2016/08/09 PHP
基于JQuery的密码强度验证代码
2010/03/01 Javascript
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
c#程序员对TypeScript的认识过程
2015/06/19 Javascript
深入理解JS中的substr和substring
2016/04/26 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
js选项卡的制作方法
2017/01/23 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
浅谈JS的原型和继承
2019/05/08 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
2020/07/27 Javascript
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
python里 super类的工作原理详解
2019/06/19 Python
Tensorflow读取并输出已保存模型的权重数值方式
2020/01/04 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
Python爬虫实例——爬取美团美食数据
2020/07/15 Python
举例讲解Python装饰器
2020/12/24 Python
中学自我评价
2014/01/31 职场文书
《跨越海峡的生命桥》教学反思
2014/02/24 职场文书
求职信怎么写范文
2014/05/26 职场文书
学校运动会广播稿100条
2014/09/14 职场文书
离婚答辩状范文
2015/05/22 职场文书
部门主管竞聘书
2015/09/15 职场文书
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android