在知乎上无意中看到了一篇有关这个的话题https://zhuanlan.zhihu.com/p/23992890,刚好没事也好久没弄swoole了就自己按照知乎上的那篇文站实操了一下

那个试验中有几个点需要注意一下:

1.首先得安装php的swoole扩展

pecl install swoole 

用php -m检查扩展是否安好

2.jquery包和弹幕所需要的包最好用他那个dist中的文件,不然的话有可能页面js会报错

3. liunx发行版安装php5.3+并且编译swoole扩展,在php.ini中加入extension=swoole.so之后打开命令行,cd到server.php所在目录,修改文件中的监听IP和端口,使用php server.php即开启服务端。 然后客户端html中修改websocket连接的服务端IP和端口,打开页面即可开始体验该实时弹幕系统。


4.index.html中的代码如下:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Title</title>

<script src="jquery.min.js"></script>

<script src="jquery.danmu.min.js"></script>

<style type="text/css">

#danmu {

width: 40px;

height: 360px;

background-color: gray;

}

#send_box {

position: absolute;

top: 500px;

left: 100px;

}

</style>

</head>

<body>

<script type="text/javascript">

console.log('尝试websocket和swoole的配合');

var ws = new WebSocket("ws://192.168.131.51:9502");//一定要以ws://开头 ,端口是否可用(试验中可以直接关闭防火墙centos7用 systemctl stop firewalld.service ;7以下的用service iptables stop )

ws.onopen = function () {

console.log("握手成功");

ws.send('hello world!!!');//向php服务器发送数据

};

ws.onmessage = function (e) {

console.log("message:" + e.data);

var time = $('#danmu').data("nowtime") + 1;

var text_obj = '{ "text":"' + e.data + '" , "color":"red" ,"size":"1","position":"0","time":"' + time + '" ,"isnew":" "}';   //构造加上了innew属性的字符串danmu对象

console.log(text_obj);

var new_obj = eval('(' + text_obj + ')');       //转化为js对象

$('#danmu').danmu("add_danmu", new_obj);   //向插件中添加该danmu对象

};

ws.onerror = function () {

console.log("error");

};

$(document).ready(function () {

$("#danmu").danmu({

left: 100,    //区域的起始位置x坐标

top: 100,  //区域的起始位置y坐标

height: 360, //区域的高度

width: 640, //区域的宽度

zindex: 100, //div的css样式zindex

speed: 20000, //弹幕速度,飞过区域的毫秒数

sumtime: 50000, //弹幕运行总时间

danmuss: {}, //danmuss对象,运行时的弹幕内容

default_font_color: "#FF0000", //弹幕默认字体颜色

font_size_small: 16, //小号弹幕的字体大小,注意此属性值只能是整数

font_size_big: 24, //大号弹幕的字体大小

opacity: "0.9", //弹幕默认透明度

top_botton_danmu_time: 6000 //顶端底端弹幕持续时间

});

$('#danmu').danmu('danmu_start');

});

function send() {

console.log(document.getElementById('content').value);

ws.send(document.getElementById('content').value); //将input输入框中的文字发送给后端服务器,让后端服务器广播之

}

</script>

<div id="danmu"></div>

<div id="send_box">

<input id="content" type="text">

<input type="submit" onclick="send()">

</div>

</body>

</html>


5.server.php中的代码如下

<?php

$server = new swoole_websocket_server("0.0.0.0", 9502);//0.0.0.0表示广播消息; 9502是刚才前端页面中定好的通信端口

$server->on('open', function (swoole_websocket_server $server, $request) {

echo "server: handshake success with fd{$request->fd}\n";//$request->fd 是客户端id

});

$server->on('message', function (swoole_websocket_server $server, $frame) {

echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";

//$frame->fd 是客户端id,$frame->data是客户端发送的数据

//服务端向客户端发送数据是用 $server->push( '客户端id' ,  '内容')

$data = $frame->data;

foreach($server->connections as $fd){

$server->push($fd , $data);//循环广播

}

});

$server->on('close', function ($ser, $fd) {

echo "client {$fd} closed\n";

});

$server->start();


后端中的输出效果

前端控制台的效果

前端弹幕页面的效果(开多个窗口都会有接受,因为刚才后端设置的是广播的形式啊)

友情链接:

http://wiki.swoole.com/wiki/page/7.html

http://www.swoole.com/

使用swoole和websocket结合来制造弹幕的更多相关文章

  1. thinkphp 6.0 swoole扩展websocket使用教程

    前言 ThinkPHP即将迎来最新版本6.0,针对目前越来越流行Swoole,thinkphp也推出了最新的扩展think-swoole 3.0. 介绍 即将推出的tp6.0,已经适配swoole.并 ...

  2. 用swoole和websocket开发简单聊天室

    首先,我想说下写代码的一些习惯,第一,任何可配置的参数或变量都要写到一个config文件中.第二,代码中一定要有日志记录和完善的报错并记录报错.言归正传,swoole应该是每个phper必须要了解的, ...

  3. php 的swoole 和websocket 连接wss

    1. 下载证书 $serv = new swoole_server('0.0.0.0', 9501, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL); $s ...

  4. swoole实现websocket推送

    环境配置:      swoole 1.9.3.centos6.5(虚拟机).PHP7.01   思路:      ①通过server中的collections取出fd      ②写一个admin. ...

  5. swoole创建websocket服务器

    目录 1 安装准备 1.1 安装swoole前必须保证系统已经安装了下列软件 1.2 下载并解压 1.3 编译安装成功后,修改php.ini 2 构建Swoole基本实例 2.1 tcp服务器实例 2 ...

  6. php swoole 和 websocket的初次碰撞

    php swoole 扩展仿佛为php开发打开了一扇窗户 阅读文档 https://wiki.swoole.com php workman和swoole原来是两个东东 swoole的使用范围更广,能做 ...

  7. Swoole练习 websocket

    WEBSOCKET 服务端代码 //创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = new swoole_websocket_server("0.0.0.0& ...

  8. swoole websocket服务推送

    用过workerman, 两个字"好用",对于swoole最近有时间也研究研究 swoole的websocket 很好实现 如官网 https://wiki.swoole.com/ ...

  9. PHP - Swoole websocket理解

    php swoole实现websocket功能 1.确保安装了swoole扩展. 2.撰写服务程序 <?php //创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = ...

随机推荐

  1. Hyper-v虚拟机文件VHDX与VHD的格式转换

    今天遇到一个坑,我在本机(windows 10)上创建的CentOS虚拟机作为docker的宿主机,部署了gitlab等容器,准备迁移到服务器上的时候,发现始终无法导入,提示必须通过Hyper-v导出 ...

  2. winAPI 中 的 GlobalLock GlobalUnlock 的作用

    在项目中遇到GlobalLock  GlobalUnlock 这两个操作内存的函数. 百度百科解释为:锁定内存中指定的内存块,并返回一个地址值,令其指向内存块的起始处.除非用 GlobalUnlock ...

  3. EasyUI需注意的问题01

    一.EasyUI-Datagrid分页 在创建数据表格(DataGrid)的时候,通过设置'pagination' 属性为 true,可以在数据表格的底部生成一个分页工具栏. <table id ...

  4. iOS进阶_动画的多种实现方式

    一.UIView动画 //UIView动画有开始beginAnimation,有结束commitAnimation    //第一步:开始UIView动画    [UIView beginAnimat ...

  5. Android 下进行单元测试 Test run failed:Instrumentation run failed due to 'java.lang.ClassNotFoundException'

    废话不说,一直报错.网上介绍的都是缺少如下声明之类. 但注意的是工程配置是导出junit包, 路径为  project上右键 --> properties -> java build pa ...

  6. android studio打包出现翻译问题

    错误信息: Error:(16) Error: "baidutieba_client_inavailable" is not translated in "en" ...

  7. Java 后台获取当前时间

    Calendar c = Calendar.getInstance();//可以对每个时间域单独修改 int year = c.get(Calendar.YEAR); int month = c.ge ...

  8. HTTP方法:GET对比POST

    http://blog.csdn.net/zhenyu5211314/article/details/17067817

  9. 【C-数据类型 常量 变量】

    一.基本数据类型 1) 整型 (int   %d) 2) 字符型 (char  %c) 3) 浮点型 %f ①. 单精度浮点型(float) ②. 双精度浮点型(double) 2.指针类型 void ...

  10. 问题:无法获得锁 /var/lib/dpkg/lock - open (11: 资源临时不可用)

    无法获得锁 /var/lib/dpkg/lock - open (11: 资源临时不可用) 问题: 运行程序更新时出现报错: 无法获得锁 /var/lib/dpkg/lock - open (11: ...