基于swoole的聊天室模型
client.html:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
<title>聊天室</title>
<script src="https://code.jquery.com/jquery-1.11.3.js" type="text/javascript"></script>
<script src="swoole.js" type="text/javascript"></script>
<style>
body {
padding: 0;
margin: 0;
font-size: 12px;
} div.form {
width: 100%;
border: 1px solid #abc;
} ul.body {
width: 100%;
} ul.body li {
clear: both;
width: 100%;
line-height: 2em;
}
</style>
</head>
<body>
<div class="form">
<input type="text" id="msg" size="100">
<input type="button" id="send" value="waiting">
</div>
<ul class="body"> </ul>
</body>
</html> swoole.js
var cSetting = {
ip: '192.168.1.11',
port: 5002 //这儿的端口要与下面swoole.php中的端口相同,且要在防火墙中打开此端口。
};
var chat = {
Socket: null,
init: function () {
var self = this;
self.Socket = new WebSocket('ws://' + cSetting.ip + ':' + cSetting.port);
self.Socket.onopen = function (e) {
if (self.Socket.readyState != 1) return;
$('input#send').val('Send');
self.Socket.send('hello');
};
self.Socket.error = function (e) {
self.Socket = false;
};
self.Socket.onclose = function (e) {
self.print('断网啦');
self.Socket = false;
};
self.Socket.onmessage = function (request) {
self.print(request.data);
};
}, send: function ($val) {
if (this.Socket == null)this.init();
if (!this.Socket)return;
this.Socket.send($val);
},
close: function () {
if (!this.Socket)return;
this.Socket.close();
},
print: function ($str) {
$('ul.body').append('<li>' + $str + '</li>');
}
};
$(function () { chat.init();
$('input#send').on('click', function () {
var input = $('input#msg');
chat.send(input.val());
input.val('');
}); $(window).bind('beforeunload', function () {
chat.close();
}); });
swoole.php 【在linux中以cli运行:例:php -f /home/test/swoole.php 】
<?php
service(5002); function service($port = 9501)
{
$setting = [
'user' => 'www', //子进程运行用户名
'group' => 'www', //子进程运行用户名所在组
// 'daemonize' => 1, //守护进程化。
'log_file' => __DIR__ . '/log1.log', //指定swoole错误日志文件。
'max_conn' => 10000, //最大允许的连接数,
'reactor_num' => 4, //线程数,为CPU核数的1-4倍,建议2倍,最大不得超过CPU核数*4。
'worker_num' => 4, //进程数。
'max_request' => 50,//每个进程的最大任务数 'task_worker_num' => 2, //配置task进程的数量,配置此参数后将会启用task功能。所以swoole_server务必要注册onTask/onFinish2个事件回调函数。如果没有注册,服务器程序将无法启动。,
'task_ipc_mode' => 1, //设置task进程与worker进程之间通信的方式,1, 使用unix socket通信 2, 使用消息队列通信 3, 使用消息队列通信,并设置为争抢模式 设置为3后,task/taskwait将无法指定目标进程ID
'task_max_request' => 0, //设置task进程的最大任务数,
'task_tmpdir' => __DIR__ . '/', //设置task的数据临时目录 'discard_timeout_request' => true, //丢弃已失联进程收到的数据请求
'backlog' => 128, //listen backlog
]; $socket = new swoole_websocket_server("0.0.0.0", $port);
$socket->addlistener('0.0.0.0', $port + 1, SWOOLE_SOCK_TCP);
$socket->set($setting); $socket->on('start', function (swoole_websocket_server $server) {
echo "Service:\n================================\n";
print_r(['master_pid' => $server->master_pid, 'manager_pid' => $server->manager_pid]);
}); $socket->on('open', function (swoole_websocket_server $server, swoole_http_request $request) {
echo "open:" . print_r($request, true) . "\n";
}); $socket->on('message', function (swoole_websocket_server $server, $request) {
echo "message:" . print_r($request, true) . "\n";
$val = $request->data;
$id = $request->fd;
if (substr($val, 0, 4) === 'send') {
var_dump($server->send($id, '【' . date('H:i:s') . '】Message Send: ' . $val));
} else if (substr($val, 0, 4) === 'task') {
$server->push($id, '【' . date('H:i:s') . '】Message Push: ' . $val . '[' . mt_rand() . ']');
$server->task([$id, $val]);
} else {
$server->push($id, '【' . date('H:i:s') . '】Message Push: ' . $val . '[' . mt_rand() . ']');
}
}); $socket->on('task', function (swoole_websocket_server $server, $task_id, $from_id, $key) {
echo "task:" . "\t taskID={$task_id}\t fromID={$from_id}\n" . print_r($key, true);
sleep(1);
$server->push($key[0], '后台回复:' . $key[1]);
$server->finish($key[0]);
}); $socket->on('finish', function (swoole_websocket_server $server, $task_id, $data) {
echo "Finish taskID={$task_id}\n";
}); $socket->on('close', function (swoole_websocket_server $server, $fd) {
echo "close:" . print_r($fd, true) . "\n";
}); $socket->start();
}
基于swoole的聊天室模型的更多相关文章
- 基于swoole搭建聊天室程序
1. 创建websocket服务器 swoole从1.7.9版本开始, 内置了websocket服务器功能,我们只需几行简单的PHP代码,就可以创建出一个异步非阻塞多进程的WebSocket服务器. ...
- LaravelS - 基于Swoole加速Laravel/Lumen
LaravelS LaravelS是一个胶水项目,用于快速集成Swoole到Laravel或Lumen,然后赋予它们更好的性能.更多可能性.Github 特性 内置Http/WebSocket服务器 ...
- websocket和基于swoole的简易即时通讯
这里描述个基于swoole的websocket 匿名群聊 UI <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- swoole webSocket 聊天室示例
swoole1.7.9增加了内置的WebSocket服务器支持,通过几行PHP代码就可以写出一个异步非阻塞多进程的WebSocket服务器. 基于swoole websocket的用户上下线通知,在线 ...
- tcpproxy:基于 Swoole 实现的 TCP 数据包转发工具的方法
假设我们希望有一台机器A(ip 192.168.1.101)要开放端口6379给用户访问,但可能实际情况是用户无法直接访问到A(ip 192.168.1.101), 但却有一台机器B(ip 192.1 ...
- Android 基于Socket的聊天应用(二)
很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能. 以下是我写的 ...
- openfire:基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件
基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件 上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfir ...
- 基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件
原文:http://www.cnblogs.com/hoojo/archive/2013/03/29/openfire_plugin_chatlogs_plugin_.html 随笔-150 评论- ...
- 基于WebSocket实现聊天室(Node)
基于WebSocket实现聊天室(Node) WebSocket是基于TCP的长连接通信协议,服务端可以主动向前端传递数据,相比比AJAX轮询服务器,WebSocket采用监听的方式,减轻了服务器压力 ...
随机推荐
- mysql数据库定时任务
应用系统运行中,经常需要定时执行一些任务,例如:定时更新汇总数据,定时更新状态数据等,目前 Treesoft数据库管理系统 增加[定时任务]功能,直接通过页面简单配置,即可按调度规则定时执行SQL任务 ...
- Java的工厂模式(二)
除了上文提到的方法之外,还可以使用Java的反射机制,这样就能使用类名称来加载所需要的类.我们只需改变工厂类和驱动类就可以了. FruitFactory.java package com.muggle ...
- vue 如何将输入框的输入自动小写转大写(使用 v-model 时采取另一种方式)
前言:小写转大写,可以用过滤器实现,但当使用 v-model 时就不行了,这里有解决方案.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9289205.html ...
- 中小型研发团队架构实践五:Redis快速入门及应用
Redis的使用难吗?不难,Redis用好容易吗?不容易.Redis的使用虽然不难,但与业务结合的应用场景特别多.特别紧,用好并不容易.我们希望通过一篇文章及Demo,即可轻松.快速入门并学会应用. ...
- Spring学习手札(二)面向切面编程AOP
AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...
- javascript之原型
写作背景 最近在抓基础,毕竟没有好地基盖楼容易塌啊...再回首javascript,原型可以说是该语言较为核心的设计之一,我们有必要了解下其设计理念 (#^.^#) 基本概念 MyObject.pro ...
- 重要BLOG
Cloud http://www.cnblogs.com/CloudMan6/tag/OpenStack/ 算法基础 http://www.cnblogs.com/ECJTUACM-873284962 ...
- 葡萄城报表介绍:Java 报表
一.Java 报表定义 Java 是一门面向对象编程语言,不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承.指针等概念,因此 Java 语言具有功能强大和简单易用两个特征.Ja ...
- Java集合 -- ArrayList集合及应用
JAVA集合 对象数组 集合类之ArrayList 学生管理系统 斗地主案例 NO.one 对象数组 1.1 对象数组描述 A:基本类型的数组:存储的元素为基本类型 int[] arr={1,2,3, ...
- iphone使用linux命令apt-get也没有问题
那么教程开始: 首先安装cydia这个越了yu就有自带的哦 然后添加源,比如apt.91.我忘了,大家可以在http://frank-dev-blog.club/?post=45找一个 查找termi ...