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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  0 v. `" s. t' t
  2. //创建socket服务2 u  |0 u/ Y% [' R
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);' P  J4 u  y% W  d- u' Y
  4. //监听WebSocket连接打开事件& l8 }8 R; ~& Q8 w1 p
  5. $ws->on('open', function ($ws, $request) {
    $ K+ ?! \& e" z- l
  6.      var_dump($request->fd, $request->get, $request->server);
    ' R+ b; o* s1 F' I* _* l6 h7 x
  7.      $ws->push($request->fd, "hello, welcome\n");6 ^- O+ E4 v3 ?7 Y  w# A$ e* |
  8. });  |7 P* D0 v( W$ g: [, }" x; D

  9. - n  y) O: v( ^7 T! }  k
  10. //监听WebSocket消息事件
    ; `, Y* n. w- F! g5 i- M8 s( G4 S
  11. $ws->on('message', function ($ws, $frame) {
    $ i' B! \' b7 A$ M8 Y9 G
  12.     //推送消息给所有用户
    $ Z4 H2 E1 ^% [6 J: d6 c5 {: x, h  L" Z
  13.     foreach($ws->connections as $fd){
    $ d% O$ H% e& G
  14.         $ws->push($fd, $frame->data);
    , a. Q+ S& l; ^& r2 @
  15.     }' @! v, T# q$ Q5 Q) R3 f" u
  16. });# y4 K* B4 f$ t& A# p7 y

  17. ; r$ V" B; x  [9 \7 p: a
  18. //监听WebSocket连接关闭事件/ I" k  F0 d- G) ^
  19. $ws->on('close', function ($ws, $fd) {, |2 h& i2 |  |6 n
  20.     echo "client-{$fd} is closed\n";
    9 n4 ^( L% K/ [# o8 L
  21. });
    " O6 e- k3 a+ j4 V) q, t! n- c9 w- Z, W
  22. //启动服务
    8 e- B+ C- M7 f5 Y. ^+ _' [" z( m) N" d
  23. $ws->start();
    ( F. K# _0 I! _7 k9 l2 `

  24. 4 t$ Q# N9 c; u3 t( w
复制代码
7 z. E9 u' @% ^' v5 L; j7 b/ x" o# |. @
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端: r9 V3 O& d% Q- C% w  J$ L& U

代码如下

  1. //连接服务器
    6 f' g* ~% U1 E, W
  2.     const socket = new WebSocket('ws://lm.com:9502');$ U' N5 Q- G4 t  q5 c
  3.     //Connection opened" c, A8 [# }* @* L! ]
  4.     socket.addEventListener('open', function (event) {
    ) R* U8 c9 M$ [6 Q" f6 {' M/ Q
  5.             //发送消息给服务器
    ) S8 P* N/ t$ M/ u
  6.         socket.send('Hello Server! im websockt');
    & h2 D9 {& I( G: I5 l
  7.     });4 k9 N1 h( d  N8 x
  8.     // Listen for messages
    3 e* @& p+ Y4 R+ ?: J* _
  9.     socket.addEventListener('message', function (event) {
    ' ~; Y8 I0 g- J
  10.             //接收服务器返回信息# Q! J% O$ x/ f5 f& G
  11.         console.log('Message from server ', event.data);
    ; `0 V' M5 X3 _
  12.     });
    8 s) \8 b: `4 T, ?. N6 a

  13.   ?% a. E, w5 V/ t5 Y
复制代码
伪直播主播页面
/ ~' x! K/ N* w& D! q  B* v

html

  1. <body>
    + `: n- `* j. M/ j4 ]' H* A
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    # O; X$ n( F# k! e8 h1 D, n3 [2 d
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">+ F- Z# ]- [1 z) g. T: x
  4.         画布7 k7 L5 S$ k  s. J8 m' n
  5.     </canvas>( r. [7 y5 s* ~) @/ U
  6.     <img src="" id="videoImage" width="350" height="700">* s, ^# Z( M/ R$ L' O) o) Q
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    & r( Z- R3 o4 g; @3 Z
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    4 {8 ^% q- W7 l* p( B9 s; r
  9. </body>: D) `3 C6 s/ r$ }' e( I; Q
复制代码

javascript

  1.     var v = document.getElementById("myVideo");& v% @& m6 k% D
  2.     var c = document.getElementById("myCanvas");
    9 `+ @7 m/ \/ z7 V5 m0 v
  3.     // var c = document.createElement("canvas");
      Y! j' i  N' x9 k2 S
  4.     var img = document.getElementById("videoImage");
    : j; T. c3 F$ Y2 B
  5.     ctx = c.getContext('2d');$ x2 x6 F1 F. s& E
  6.     var dataUrl;
    4 ]6 L* Q% W/ E, j( }
  7.     const socket = new WebSocket('ws://xxxx.com:9502');  l$ z7 U& H) u3 Y" j: N5 j
  8.     //Connection opened: S4 [; A5 v& ^, c5 U8 V
  9.     socket.addEventListener('open', function (event) {
    / N, d: [, B# ?) _0 W
  10.         // socket.send('Hello Server! im websockt');5 d- |+ j: D3 a4 n- s
  11.     });
    % a3 K- P- K: N. D% e% V4 ]2 P
  12.     // Listen for messages
    0 ?$ N2 Z9 w2 M0 ]# p; ^' g
  13.     socket.addEventListener('message', function (event) {
    $ B: a: E, d1 y  j# W6 p+ t
  14.         console.log('Message from server ', event.data);
    ; B& W& o% E8 N# F; P% I
  15.         img.src = event.data;
    . g  ?7 [+ w$ ]
  16.     });
    9 z3 ]2 i- k- f6 `3 W8 `; M

  17. % u# T6 G% D& [) q. @7 ?
  18.     function playVideo() {
    4 W( x7 e; I& w, f0 b
  19.         ctx.drawImage(v, 0, 0, 350, 700);# }" k4 A* J) a; l
  20.         dataUrl = c.toDataURL("image/png");
    ( y# N/ I7 Z, n5 _6 a
  21.         // img.src = dataUrl;8 E2 e: N5 _% ^; N* w
  22.         socket.send(dataUrl);6 w' H7 w7 ^) i% W. w+ c
  23.     }% T' @3 D& V+ C8 \. s) W
  24.     var tick;
    4 Q: Z( z, ?. q/ r1 _
  25.     function aphla() {+ r% K* w* w( ?: T5 j9 W
  26.         tick = setInterval(function () {) e- n1 R/ x( Y8 e
  27.             playVideo();
    * A" @8 h7 ]; y4 V  O, S7 M
  28.         }, 1);
    4 }. A" L1 ~) ~7 e0 s
  29.     }
    7 ?& ?. o8 @( d, R  C3 S
  30.     function vdStop() {- X5 D' O/ X1 L& n- x" ^9 n  D
  31.         clearInterval(tick);
    5 a3 G3 j1 d& u+ i; J
  32.     }
    " p7 ~# W1 i- N" p
复制代码
用户页面
& {3 F+ `. E$ L( T* O6 p" |

html

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

javascript

  1. var img = document.getElementById("liveImg");
    1 g1 ?* N. Y# {
  2.     const socket = new WebSocket("ws://lm.com:9502");5 D9 L9 h7 g% W
  3.     //8 D) d  c3 h3 e6 J2 s' z. A
  4.     socket.addEventListener('open',function(){9 C; F5 @7 s- |) B) ?7 c
  5.      socket.send('Hello Server! Im live.html');$ X$ I1 Q" e4 `: v) A7 k
  6.     });
    $ u4 T5 J* P* B5 t& C: j/ W  y
  7.      // Listen for messages
    $ U+ S/ M8 t" w# }9 P) |& O
  8.     socket.addEventListener('message', function (event) {7 N  l+ B& H! G% n7 v9 M) ^% Z
  9.         //图片地址
    1 R2 O& c$ j( i  D# n! B" x8 _8 G
  10.         img.src = event.data;
    : b7 Y3 k& n6 B7 l# ]
  11.     });9 h0 T* _3 F* K+ u- F. j+ f: z# n
复制代码

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


, r5 Z( f( E7 c1 d  ~4 s3 S0 ]. w& {% P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-18 18:55 , Processed in 0.112756 second(s), 19 queries .

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