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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    1 C; f, O. p7 w% ^3 o. Z0 f* @
  2. //创建socket服务
    , ]( W" |4 Y& V6 N! W! C* I
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    - ^+ t' e7 \8 ?; @
  4. //监听WebSocket连接打开事件
    5 f) S8 D' K+ J% O* r
  5. $ws->on('open', function ($ws, $request) {  Z6 z! u* c9 m, ^# f* @
  6.      var_dump($request->fd, $request->get, $request->server);4 I0 T2 s( S, v" L$ X" ?; j
  7.      $ws->push($request->fd, "hello, welcome\n");
    " V: W+ i/ f. w
  8. });! }7 N8 ^# I+ h5 @1 }
  9. $ c, k4 b- u$ R  g% |6 O
  10. //监听WebSocket消息事件
    * v  x4 _0 l( a3 p) {$ |, P) {( x
  11. $ws->on('message', function ($ws, $frame) {+ Z) d% X9 D8 A0 n( l' R/ q6 E
  12.     //推送消息给所有用户
    ' y6 W+ i1 ]! f5 C8 @1 q
  13.     foreach($ws->connections as $fd){
    " T7 G9 q2 M3 }! x% l0 E
  14.         $ws->push($fd, $frame->data);+ Z. Y, y) C& F( v
  15.     }, x% C8 F3 [) C% K' x5 m
  16. });
    , j- v4 a) M$ N
  17. 4 J: G& ~& ~, ~( p  u' d! \
  18. //监听WebSocket连接关闭事件0 V, ~5 J) J9 ~2 ^/ @( p! M
  19. $ws->on('close', function ($ws, $fd) {
    : P1 t4 {0 e( m: D
  20.     echo "client-{$fd} is closed\n";
    + [, I7 C; \- C, B8 M
  21. });% l& @6 M  m6 v" C) b& B
  22. //启动服务8 W3 O* M% h: E3 s
  23. $ws->start();7 a% Y! z8 g3 b- F9 A, J& z+ `
  24. # |8 y" i$ J: b9 W  P5 d; Z
复制代码

( l6 Z. E  {' [2 p7 p5 r; gWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
6 C& r& m. |7 q" J+ {

代码如下

  1. //连接服务器! y2 g! C( E! `+ X
  2.     const socket = new WebSocket('ws://lm.com:9502');
    2 n  [! I& L- c" C3 ]& Y
  3.     //Connection opened
    ; E" t6 z; e( I$ L$ p
  4.     socket.addEventListener('open', function (event) {& J+ T! w1 ~+ y) z
  5.             //发送消息给服务器
    6 w: w7 U2 X7 m' ]# u2 e
  6.         socket.send('Hello Server! im websockt');9 i/ U4 a0 i8 x3 c3 }) @  U
  7.     });
    " g" S; ?" \4 o) K; J4 K
  8.     // Listen for messages
    - t  `3 f! G% E9 U2 R5 u3 b, @/ X
  9.     socket.addEventListener('message', function (event) {3 d2 }: [* ]9 [5 D. U
  10.             //接收服务器返回信息
    ' }" ?* r: x& I% x8 S
  11.         console.log('Message from server ', event.data);) Q* k. t: p) s  h2 X
  12.     });8 C& E* x3 o% e& E8 O. [
  13. % s$ E# ?/ [0 Z. ?$ i- \1 i
复制代码
伪直播主播页面: o, u. `% {4 c+ z$ n. R

html

  1. <body>
    5 Y, ]# M9 T+ ^) Z
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>( u( \0 ~! H% J! T+ H
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    * Q0 b; y% v; H: g
  4.         画布+ o$ Q: N) `4 F6 V
  5.     </canvas>1 \5 R8 ?" ^2 ^$ ^3 |8 m/ v5 E
  6.     <img src="" id="videoImage" width="350" height="700">" }6 F4 M. S- g% [
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>2 h* ~2 `% _* D% ~1 J
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    " |$ I) Y; }3 ^8 U* X& E& I
  9. </body>
    $ N" l/ w, F, c% r. e8 H1 r
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    6 u8 L7 g; |) }/ [$ Q- o& B
  2.     var c = document.getElementById("myCanvas");
    , ]" w1 S- f0 W  G- }( @2 i
  3.     // var c = document.createElement("canvas");. |- L: L" |7 L& f% X
  4.     var img = document.getElementById("videoImage");; I* ?7 E/ u* w5 F+ O
  5.     ctx = c.getContext('2d');4 Q; o5 C8 ^) w) G7 n
  6.     var dataUrl;, S0 {, C7 w; H, q+ L
  7.     const socket = new WebSocket('ws://xxxx.com:9502');* P  h3 a3 B' s& b$ V8 O- _! g, o8 s
  8.     //Connection opened1 a) y3 N5 S9 F
  9.     socket.addEventListener('open', function (event) {
    ' C, n6 ^& e" f* f5 k
  10.         // socket.send('Hello Server! im websockt');
    2 N! y, E+ f# [( {: z, l) d8 w
  11.     });
    ( N  l! _2 `  ?# \- |4 g+ h4 S/ X
  12.     // Listen for messages4 E" l1 q" N+ _7 Y
  13.     socket.addEventListener('message', function (event) {
    : m2 I' K8 f- n( l2 N
  14.         console.log('Message from server ', event.data);
    9 B9 A+ _5 ^/ R) Z" w9 l% V; \
  15.         img.src = event.data;6 n5 T' J* q, Q3 D& g2 @2 I. w* a
  16.     });0 s% [, H* o# i2 D  I
  17. % B+ O1 r# w& Y$ ^
  18.     function playVideo() {$ {; ~% |4 t: Z, z( u9 U- v0 M
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    ; }$ O: l& N. _+ s8 u( F
  20.         dataUrl = c.toDataURL("image/png");
    . D; S  v( a  [3 e
  21.         // img.src = dataUrl;, K) G6 E5 T9 J- d/ Q
  22.         socket.send(dataUrl);
    ( c( T8 s- s& ]
  23.     }. v2 |) c: \5 i4 i+ G
  24.     var tick;
    1 _$ ]* O) B, Q& W; X4 {. \
  25.     function aphla() {2 S' o" i. M9 Z( B
  26.         tick = setInterval(function () {8 k* }: J4 T8 [6 f4 v9 `
  27.             playVideo();6 Y/ W, [9 Q$ ^* a% w+ g( _
  28.         }, 1);% ^* }& ]0 _. L% \" O8 Q3 ]
  29.     }4 h$ ^+ @* l8 u* C
  30.     function vdStop() {
    # W- J: R: ^! Y+ R0 U
  31.         clearInterval(tick);
    6 X9 n, X; ?- c6 @6 e# x" G* T; i8 V
  32.     }9 F) v& I* n$ g4 N. X2 x
复制代码
用户页面
' T: B( d; W7 h8 w+ B+ H$ b5 i

html

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

javascript

  1. var img = document.getElementById("liveImg");
    & n& s' m0 U2 f3 z+ D* A  z
  2.     const socket = new WebSocket("ws://lm.com:9502");% L. s% {1 E  u1 P( W. |4 d* u& Y) Q& V3 r
  3.     //
    % B' \" c  _$ b8 x; @
  4.     socket.addEventListener('open',function(){# W* j1 u2 ~1 {
  5.      socket.send('Hello Server! Im live.html');
    * O' N/ G$ m9 a/ N( ]& e
  6.     });. \- N0 g# j& s5 l- i; C# W
  7.      // Listen for messages0 ^+ R% n+ _  q3 \  ]2 |
  8.     socket.addEventListener('message', function (event) {
    # y( G/ ]5 R- o! q! B7 c
  9.         //图片地址( j  B1 w9 s2 D6 h1 O; S% x
  10.         img.src = event.data;
    3 Q7 f$ j  M. l* d1 J0 t# S
  11.     });! G$ N7 N8 u! N# m5 g
复制代码

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

( T* B6 P" N1 k6 H! D
/ d  t4 q! L/ N! t! p2 F7 |2 C' @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 22:40 , Processed in 0.117681 second(s), 21 queries .

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