您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 14087|回复: 0
打印 上一主题 下一主题

[swoole] PHP大道至简之Swoole伪直播功能

[复制链接]
跳转到指定楼层
楼主
发表于 2020-3-31 19:50:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
伪直播功能Websocket服务器6 R5 i1 G" u* \( W
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websockt服务

代码如下

  1. error_reporting(-1);  
      J7 ~2 n4 y; O: c" ?8 |$ Q3 C
  2. //创建socket服务
    2 h! Y$ p  k$ x. j. v3 a* u
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    9 u% S9 M0 P# x: @# Q" i
  4. //监听WebSocket连接打开事件
    5 Q, n$ ^: s/ C
  5. $ws->on('open', function ($ws, $request) {
    7 m) @* S5 W4 ]
  6.      var_dump($request->fd, $request->get, $request->server);  r& Z% ^$ N! `
  7.      $ws->push($request->fd, "hello, welcome\n");
    . n' l0 e% ?" k7 q+ K
  8. });
    9 ?, q; A$ `% ^8 }( k
  9. + x0 v" h$ D  y2 S( v) G
  10. //监听WebSocket消息事件/ Z1 H) L0 C( f8 J3 M0 v
  11. $ws->on('message', function ($ws, $frame) {
    1 j+ u, A9 z5 v  v5 ?% N
  12.     //推送消息给所有用户2 ?: O& [6 G1 M/ g1 _" q: d/ H" o
  13.     foreach($ws->connections as $fd){& R, ?5 J' V/ R: Q1 b1 [, F
  14.         $ws->push($fd, $frame->data);* l/ c( c0 D+ I) o" ~3 g: w
  15.     }4 ]3 i# }$ n; e
  16. });
    * B' e. O* ?" n' e! d

  17. " x& Y9 m' Y4 j: u) q& Y& q! g
  18. //监听WebSocket连接关闭事件# X8 N6 W. Q% ~3 Y0 l
  19. $ws->on('close', function ($ws, $fd) {
    3 x( p* y& {8 t+ C1 Y) K& S
  20.     echo "client-{$fd} is closed\n";2 Q9 Y4 O8 j& {7 L& r
  21. });
    1 v& T' q3 i! y5 k. C# p; \+ S
  22. //启动服务  V: D+ P8 [' D0 J  E9 r  _: e
  23. $ws->start();
    1 V$ h# P5 E! {
  24. 6 M: g2 W1 S; q
复制代码
" S0 h9 }# V5 e
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
3 h) `  C+ r, S2 ~, Y' u5 O: x  w

代码如下

  1. //连接服务器) L+ K( G2 k- E0 M/ k. x  z
  2.     const socket = new WebSocket('ws://lm.com:9502');& @( t0 M+ `7 W7 ~  k' r+ M
  3.     //Connection opened
    % ?& n& D6 t  z$ N
  4.     socket.addEventListener('open', function (event) {) B# Z; ^1 I8 @, i9 i
  5.             //发送消息给服务器+ J$ A: H1 ^9 c, z+ N1 l
  6.         socket.send('Hello Server! im websockt');
    ( F/ v5 J+ Y9 n& F0 P/ P3 n
  7.     });9 {, A2 G2 w$ [7 z, @$ m  Q. l
  8.     // Listen for messages
    . a5 d2 b: g: V# v% B/ i0 n6 l
  9.     socket.addEventListener('message', function (event) {
    . F4 t$ F# X; V- Y& o0 S
  10.             //接收服务器返回信息3 [6 Y8 c! g2 [: l# M
  11.         console.log('Message from server ', event.data);0 y4 X4 i, n3 T/ o/ s' g# [6 b) F
  12.     });+ [5 i% `& N; O% W" o

  13. . M. ^9 ?) o4 b
复制代码
伪直播主播页面
" W8 G5 X2 U$ O/ J/ F3 j

html

  1. <body>& s8 E7 t& M0 ]8 C
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    : e3 x6 ^8 Q) E4 T7 K
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">! g9 U. k- C) o. a; i
  4.         画布
    1 k  F& g1 n' B7 [
  5.     </canvas>8 c* P) X3 e; Z' D# Y; r( m4 t2 D" K
  6.     <img src="" id="videoImage" width="350" height="700">
    # I+ X* |4 o; e; U
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>3 s0 }8 P3 s$ B3 Y2 \6 }- I! J% |
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>) }3 |* m. o+ l7 ^
  9. </body>. q4 v! C+ {# ?
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
      |# u# M3 q/ ?* i- _
  2.     var c = document.getElementById("myCanvas");
    ) [/ h! Z1 |6 T1 [" P6 M
  3.     // var c = document.createElement("canvas");- N3 o0 j& i5 N
  4.     var img = document.getElementById("videoImage");3 E# _: t4 B7 Q- R) f4 a7 p
  5.     ctx = c.getContext('2d');$ A: A$ o. G8 Z2 O( `0 w
  6.     var dataUrl;% J0 C8 b) y3 m; k
  7.     const socket = new WebSocket('ws://xxxx.com:9502');/ i! F& b8 x2 p) C
  8.     //Connection opened
    : \' X1 k0 r; s% ]# ]) |
  9.     socket.addEventListener('open', function (event) {1 t/ O& N3 P/ Q
  10.         // socket.send('Hello Server! im websockt');
    % J* c1 n9 b% B) P  u2 {
  11.     });6 |% `# h) v4 w3 N4 F* h$ o' }
  12.     // Listen for messages
    0 g0 ~, X* h0 o8 Z/ U8 r9 ?2 n, p
  13.     socket.addEventListener('message', function (event) {
    0 t. N2 \; t, S* b$ h5 p  D
  14.         console.log('Message from server ', event.data);
    $ F, x8 ]" c$ c. K! a8 b$ y
  15.         img.src = event.data;
    / j: L2 c, |8 m( G9 J. I
  16.     });
    4 ^! X6 v* p4 i
  17. ! ]6 l! H: E5 P5 L; w% h
  18.     function playVideo() {
    6 a6 }9 W9 e! g4 f
  19.         ctx.drawImage(v, 0, 0, 350, 700);& e$ E/ l; \: l) @5 y- Z/ N% R9 f
  20.         dataUrl = c.toDataURL("image/png");
    ; V( f- G  D1 r# i/ V
  21.         // img.src = dataUrl;8 a- U' X! L# u9 a1 n/ v( ]0 T, {
  22.         socket.send(dataUrl);
    / p6 v8 t0 t9 F6 T
  23.     }8 {0 x+ A6 r  o6 ^- j  b
  24.     var tick;0 L! x& `; V% a$ g2 b3 R' {$ P5 j
  25.     function aphla() {
    / Q9 g% d) d. r/ I' z
  26.         tick = setInterval(function () {7 B2 E; g/ {3 x) ]) E% f
  27.             playVideo();
    # s* R" ]9 E# g
  28.         }, 1);
    3 L0 d, v5 y# e  D, c2 k( x
  29.     }
    5 w8 x( n+ ?2 ^) j' u+ M
  30.     function vdStop() {
    9 H& _9 m; d$ O' Y
  31.         clearInterval(tick);1 O- i3 m$ X2 d# ?' s# R6 d$ R
  32.     }7 A# W; _% I* Z8 s, h
复制代码
用户页面
, x4 l" K0 }, c2 L3 z, k6 W$ \

html

  1. <img src="" id="liveImg">
复制代码

javascript

  1. var img = document.getElementById("liveImg");5 F; l' Z: ^/ }
  2.     const socket = new WebSocket("ws://lm.com:9502");
    + R! {4 m" `/ `6 |% M. a) \+ ?" n
  3.     //
    . T8 e2 V- N& O; {  G" K
  4.     socket.addEventListener('open',function(){
    5 H9 J( `0 f0 v- l
  5.      socket.send('Hello Server! Im live.html');
    4 s& y! w# w0 i7 p) l0 m
  6.     });! _8 }( l" J. o: _( d0 Y6 G1 v: Z
  7.      // Listen for messages
    2 X; u  p/ _- }8 W
  8.     socket.addEventListener('message', function (event) {
    % @1 z# L0 d; V+ }
  9.         //图片地址5 m' ~0 y! C' S5 p( w7 z5 K- v
  10.         img.src = event.data;
    4 o9 O* B" \6 @, t0 @# e
  11.     });
    0 Y% Y8 e  T- \( @
复制代码

真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法


( ^5 a4 b0 [) Z& t" U5 B7 S
/ A) ?+ C5 i/ x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:46 , Processed in 0.050066 second(s), 20 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!