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 相关文章推荐
一个用于MySQL的PHP XML类
Oct 09 PHP
Uchome1.2 1.5 代码学习 common.php
Apr 24 PHP
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
Oct 31 PHP
php程序效率优化的一些策略小结
Jul 17 PHP
windows下zendframework项目环境搭建(通过命令行配置)
Dec 06 PHP
如何用PHP实现插入排序?
Apr 10 PHP
php实现自动获取生成文章主题关键词功能的深入分析
Jun 03 PHP
PHP实现的多彩标签效果代码分享
Aug 21 PHP
php文件夹的创建与删除方法
Jan 24 PHP
全面了解PHP中的全局变量
Jun 17 PHP
PHP进行批量任务处理不超时的解决方法
Jul 11 PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 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求最大子序列和的算法实现
2011/06/24 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
使用PHP接受文件并获得其后缀名的方法
2015/08/05 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
封装的原生javascript弹出层代码
2010/09/24 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
jQuery中获取Radio元素值的方法
2013/07/02 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
javascript中innerText和innerHTML属性用法实例分析
2015/05/13 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
jQuery中get方法用法分析
2016/12/07 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
详解微信小程序开发聊天室—实时聊天,支持图片预览
2019/05/20 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
Python 自动化表单提交实例代码
2017/06/08 Python
python PyTorch参数初始化和Finetune
2018/02/11 Python
python操作日志的封装方法(两种方法)
2019/05/23 Python
Django中间件基础用法详解
2019/07/18 Python
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
创意广告词
2014/03/17 职场文书
高中学校对照检查材料
2014/08/31 职场文书
农业生产宣传标语
2014/10/08 职场文书
学生保证书格式
2015/02/27 职场文书
总结会主持词
2015/07/02 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
PHP判断是否是json字符串
2021/04/01 PHP
Python编解码问题及文本文件处理方法详解
2021/06/20 Python