php swoole+websocket

客户端代码

<!DOCTYPE html>
<html>
<head>
<title></title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta charset="utf-8"/>
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.4/css/bootstrap.min.css">
<link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.4/css/bootstrap-theme.min.css">
<script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
<script src="http://cdn.bootcss.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<script src="http://cdn.bootcss.com/socket.io/1.3.5/socket.io.js"></script>
</head>
<body>
<div id="box" style="max-width:700px;margin:0 auto;">
<div class="panel panel-default">
<div class="panel-heading"><h2>聊天室</h2><span style="color:green;display:none;">(当前在线:<span id="length">0</span>人)</span></div>
<div class="panel-body" id="body" style="height:400px;overflow-y:auto;">
</div>
</div>
<div class="input-group">
<input type="text" class="form-control" id="in" placeholder="您想说什么?" aria-describedby="basic-addon2">
<span class="input-group-addon" id="basic-addon2" style="cursor:pointer;">发送</span>
</div>
</div>
<div class="modal fade bs-example-modal-sm" data-backdrop="static" id="model" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<div class="input-group">
<input type="text" class="form-control" id="name" placeholder="请输入您的昵称" aria-describedby="basic-addon3">
<span class="input-group-addon" id="basic-addon3" style="cursor:pointer;">开始聊天</span>
</div>
</div>
</div>
</div>
</body>
<script>
$(document).ready(function(){
window.username = 'others';
var wsServer = 'ws://192.168.151.125:9502';
var websocket = new WebSocket(wsServer); websocket.onopen = function (evt) {
console.log("Connected to WebSocket server.");
$("#model").modal('show');
}; websocket.onmessage = function (evt) {
console.log('Retrieved data from server: ' + evt.data);
$(".panel-body").append(evt.data);
//$(".panel-body").append('<p><span style="color:#177bbb">'+evt.data.username+'</span> <span style="color:#aaaaaa">('+evt.data.time+')</span>: '+evt.data.msg+'</p>');
var body = document.getElementById("body");
body.scrollTop = body.scrollHeight;
$("#in").focus(); }; $("#basic-addon2").click(function(){
var msg = $("#in").val();
websocket.send(msg);
$("#in").val('');
}); $("#basic-addon3").click(function(){
window.username = $("#name").val();
websocket.send("login|@|"+window.username);
$("#model").modal('hide');
}); });
</script>
</html>

php代码

安装

swoole扩展(php官方已经支持)

可直接安装

linux执行

pecl install swoole

成功后查看phpinfo是否安装成功swoole

服务端代码

date_default_timezone_set('PRC');
$users = array();
//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502); $ws->set(array(
'worker_num' => 1,
)); //监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
// var_dump($request->fd, $request->get, $request->server);
//global $users;
// var_dump($users);
// $users[] = $request->fd;
//var_dump($users);
//$ws->push($request->fd, "hello, welcome\n");
}); //监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
global $users;
// var_dump($frame);
$data = $frame->data;
$arr = explode('n|@|',$data);
if(count($arr)>1){
$users[$frame->fd] = $arr[1];
foreach($users as $fd=>$name){
$ws->push($fd,'<p><span style="color:#177bbb">系统通知</span><span style="color:#aaaaaa">('.date('H:i:s').')</span>:'.$arr[1].'加入聊天</p>');
}
}else{
// var_dump($users);
foreach($users as $fd=>$name){
//$msg = 'from'.$name.":{$frame->data}\n";
$msg = '<p><span style="color:#177bbb">'.$users[$frame->fd].'</span> <span style="color:#aaaaaa">('.date('H:i:s').')</span>: '.$frame->data.'</p>';
$ws->push($fd,$msg);
}
} }); //监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
echo "client-{$fd} is closed\n";
}); $ws->start();

简单的聊天室就ok了

简单的聊天室代码php+swoole的更多相关文章

  1. ASP.NET Signalr 2.0 实现一个简单的聊天室

    学习了一下SignalR 2.0,http://www.asp.net/signalr 文章写的很详细,如果头疼英文,还可以机翻成中文,虽然不是很准确,大概还是容易看明白. 理论要结合实践,自己动手做 ...

  2. [SignalR]一个简单的聊天室

    原文:[SignalR]一个简单的聊天室 1.说明 开发环境:Microsoft Visual Studio 2010 以及需要安装NuGet. 2.添加SignalR所需要的类库以及脚本文件: 3. ...

  3. Android简单的聊天室开发(client与server沟通)

    请尊重他人的劳动成果.转载请注明出处:Android开发之简单的聊天室(client与server进行通信) 1. 预备知识:Tcp/IP协议与Socket TCP/IP 是Transmission ...

  4. Netty学习笔记(四) 简单的聊天室功能之服务端开发

    前面三个章节,我们使用了Netty实现了DISCARD丢弃服务和回复以及自定义编码解码,这篇博客,我们要用Netty实现简单的聊天室功能. Ps: 突然想起来大学里面有个课程实训,给予UDP还是TCP ...

  5. 玩转Node.js(四)-搭建简单的聊天室

    玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一 ...

  6. 用ServletContext做一个简单的聊天室

    这里主要是ServletContext的一个特性:ServletContext是一个公共的空间,可以被所有的客户访问.由此可见ServletContext比cookie和session的作用范围要大[ ...

  7. 基于websocket实现的一个简单的聊天室

    本文是基于websocket写的一个简单的聊天室的例子,可以实现简单的群聊和私聊.是基于websocket的注解方式编写的.(有一个小的缺陷,如果用户名是中文,会乱码,不知如何处理,如有人知道,请告知 ...

  8. nodejs与websocket模拟简单的聊天室

    nodejs与websocket模拟简单的聊天室 server.js const http = require('http') const fs = require('fs') var userip ...

  9. 基于Server-Sent Event的简单在线聊天室

    Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览知乎时 ...

随机推荐

  1. Linux Shell 2>&1 &

    转  脚本如: nohup /mnt/Nand3/H2000G >/dev/null 2>&1 & 对 于& 1 更准确的说应该是文件描述符 1,而1 一般代表的就 ...

  2. HP T505恢复出厂系统

    1.制作usb启动U盘. ------ 从HP网站上下载,或者找供应商提供 2.按F11,从U盘启动进去,会自动执行安装,等待完成即可以.

  3. 关于jQuery外部框架

    (function(window, undefined) {         var jQuery = ...         ...             window.jQuery = wind ...

  4. linux 下 C语言显示中文

    例如:tset.c int main() { printf("你好,世界\n"); retuen 0; } 编译时应该这样: iconv -f gb2312 -t utf8 tes ...

  5. IOS OC 多任务定时器 NSRunLoop 管理 NSTimer

    下面有两种做法 1.使用日期组件 NSDateComponents 2.使用NSString 生成一个日期 //  创建一个日历对象 NSCalendar *calendar = [NSCalenda ...

  6. PB代码动态解析执行器

    当你看到VB.VFP等开发语言提供的强大的宏执行功能,是不是很羡慕呢?当你寻遍PB的帮助.关于PB开发的书籍或网站而不可得的时候,是不是感到有一丝的遗憾?如果你看到这篇文章,你应该感到振奋,因为你终于 ...

  7. SQLALchemy(连表)、paramiko

    本节内容:

  8. Unattend.xml应答文件制作(WISM)

    将制作好的应答文件unattend.xml拷贝到模板机sysprep目录下,然后在cmd下运行 (unattend.xml文件可自定义名称)   sysprep /generalize /oobe / ...

  9. android gradle的全局管理

    转自:https://github.com/stormzhang 工程目录下建立baseConfig.gradle文件 内容如下 ext { android = [compileSdkVersion: ...

  10. javascript下ie7,ie8的Date Bug的解决

    ie9+, chrome firefox opera下 string到Date 使用  new Date("2013-01-01"); 都是ok的. 但在ie7, ie8下 返回N ...