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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
      x; ]5 \' X8 v9 `4 e' \& a
  2. //创建socket服务
    5 h2 H; b& S1 N' z
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);6 {; x" n! Z' U8 X: n
  4. //监听WebSocket连接打开事件1 W$ h( A5 q) W. y3 M" v
  5. $ws->on('open', function ($ws, $request) {: ?% e; H% j* _0 E* q/ {' C
  6.      var_dump($request->fd, $request->get, $request->server);
    4 @. }8 ?  Q+ \) D& K) ~& |
  7.      $ws->push($request->fd, "hello, welcome\n");" \/ ]# I9 U6 _- q- l5 b
  8. });, x5 N! n. V( a2 v- [( ?
  9. ' Q% \- s1 f  V0 T  D$ u
  10. //监听WebSocket消息事件
    9 J% k9 H- d. a+ Z' S
  11. $ws->on('message', function ($ws, $frame) {. [- f1 V% B  y% @% K2 |( O
  12.     //推送消息给所有用户
    , @& b% ~! W, R" q) S& Q
  13.     foreach($ws->connections as $fd){6 T0 }3 n3 J% e7 X& u7 T" t
  14.         $ws->push($fd, $frame->data);# |" f% x1 A) S7 I, Q3 _
  15.     }
    ( P9 m) V! @3 g$ A2 b) ~1 @
  16. });
    2 X7 G# e, g, Q1 J) s

  17. 6 r; D; H# M0 O, f" R2 _
  18. //监听WebSocket连接关闭事件
    7 n- O4 _/ b$ K) K* G
  19. $ws->on('close', function ($ws, $fd) {
    " s+ S% c9 [7 i; t& v  F
  20.     echo "client-{$fd} is closed\n";& U  v7 e$ q0 J0 ]& s1 c
  21. });4 [9 E  ^1 d8 c0 R9 L
  22. //启动服务
    , f& y( I+ t. T7 z2 E
  23. $ws->start();
    9 E; C1 N$ u7 T' J5 o$ Q3 M
  24. 8 `/ Z: f! G+ e; P4 p3 z; G
复制代码

* w8 z8 M, X! Y+ v2 M7 m" {Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端6 Q  j; ]) v- t( F# v5 m

代码如下

  1. //连接服务器* ~/ O8 G+ l9 Z/ i/ x
  2.     const socket = new WebSocket('ws://lm.com:9502');+ |! L: `2 ?9 u  G) t% O
  3.     //Connection opened
    - l" E- j0 O1 Q  i' d1 R
  4.     socket.addEventListener('open', function (event) {/ J! K( B4 q! h0 @
  5.             //发送消息给服务器
    6 c- l2 l: X& L9 ]) G
  6.         socket.send('Hello Server! im websockt');
    , d. v) F& F% H3 B% P, ]
  7.     });
    ! i9 f% O$ {/ Q2 ^( o2 s: c
  8.     // Listen for messages- B. Q& z! z* s' D8 p9 }6 M2 Q1 _
  9.     socket.addEventListener('message', function (event) {
    5 i* W- |2 G& ]: n
  10.             //接收服务器返回信息
    # s- }' }8 n! _* A2 D4 {  A9 e
  11.         console.log('Message from server ', event.data);6 t$ n2 [# {& K1 T
  12.     });
    8 u: ~2 e+ O' A! S. H4 H# w5 e
  13. 1 L+ N% V! U( K
复制代码
伪直播主播页面
( J: Q/ L8 p& s# v; a# l/ Y

html

  1. <body>
    * j# s/ w- U$ t
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>: C/ Y* Y6 t  H# ?$ Y
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">( A& y7 D9 S6 z$ \" F( i
  4.         画布9 J) y) }5 `2 l; d- z6 ?9 g8 C1 C
  5.     </canvas>! A7 n2 g# f: ?
  6.     <img src="" id="videoImage" width="350" height="700">' K2 T  Q# ?7 u+ j' a! d' p
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    " X6 Y6 o( F1 @/ t: u
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>+ \" t0 l. \0 g" F+ e
  9. </body>
    0 n* o$ z; P- c" T( m2 N
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    " [! t$ q0 g" e& D; ]0 {3 B3 a
  2.     var c = document.getElementById("myCanvas");
    : \5 e: u4 r% y& ?7 x) [/ n
  3.     // var c = document.createElement("canvas");
    0 F6 h3 ]- {- F7 P
  4.     var img = document.getElementById("videoImage");
    7 W- W: h1 j8 W1 C4 f/ [' s: _
  5.     ctx = c.getContext('2d');; h: ^; l6 z5 J2 y: D; }! H" o: W. E( c
  6.     var dataUrl;
    1 v  i- H2 @0 \- W3 v
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    1 s4 [+ H) z( V( y; j7 h& k" h
  8.     //Connection opened
    8 y5 g6 w% O, T9 P  N
  9.     socket.addEventListener('open', function (event) {
    : ?+ P. W4 H8 C$ t7 [3 I  F$ P
  10.         // socket.send('Hello Server! im websockt');
    & k+ b4 @$ n$ K" ~# l# ?
  11.     });
    0 L4 B  ~' p& U( t8 v4 f
  12.     // Listen for messages4 ]  n9 r; B3 J
  13.     socket.addEventListener('message', function (event) {
      \6 C. }, ?5 a! a* `1 B' m
  14.         console.log('Message from server ', event.data);" F6 c5 O! d5 F0 L. y. \
  15.         img.src = event.data;9 c( Y  N1 q) C, B. b
  16.     });
    ( \' s( X" L3 y. u; `
  17. ' E0 w/ Q: O) i, G3 V
  18.     function playVideo() {0 E* {: R2 H7 k
  19.         ctx.drawImage(v, 0, 0, 350, 700);0 K8 n) E4 E8 ^
  20.         dataUrl = c.toDataURL("image/png");
    5 m  g5 l& c% ~8 c4 V' O" Y- x  G
  21.         // img.src = dataUrl;; F/ G8 N! m0 B. I0 [1 B/ k% n
  22.         socket.send(dataUrl);
    % O6 o6 X% `% z  Z! w3 p- Z; Z
  23.     }
    ( z) M4 D) T7 J/ F7 G6 \* @
  24.     var tick;
    . {, r1 a6 F6 }. f/ X/ }6 F
  25.     function aphla() {
    ) R  _* z0 i. B  d5 B& e! E3 c. f  ^
  26.         tick = setInterval(function () {
    4 S2 l" p7 Q) L" t; m
  27.             playVideo();( z0 e1 n' A! ~; O9 h4 J9 t
  28.         }, 1);
    2 t: U# Q: r& s+ b" B7 @
  29.     }$ L, f! N& \( h; p
  30.     function vdStop() {
    0 T! g) o5 O6 \# d$ q! j
  31.         clearInterval(tick);
    & y& B5 B7 x* o
  32.     }5 O& f9 F: M1 t4 C0 x% [5 i
复制代码
用户页面
5 ~5 I9 Y9 c2 z1 ?, @3 w. p' }

html

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

javascript

  1. var img = document.getElementById("liveImg");
    0 Y) c; r0 i& T( a- f
  2.     const socket = new WebSocket("ws://lm.com:9502");
    $ [3 y# B4 f, h
  3.     //
    4 Y  a% s4 U) l
  4.     socket.addEventListener('open',function(){3 c, W$ V, N! x
  5.      socket.send('Hello Server! Im live.html');
    3 m/ H. K# c/ r7 t0 j5 q' @6 G6 S
  6.     });
    " _9 o! }2 ~- V, N
  7.      // Listen for messages$ F5 I) }  k) S( v& j: e) [- F
  8.     socket.addEventListener('message', function (event) {# e1 b) G, k' Z# T
  9.         //图片地址! B: c% S: |1 d: ?* L# s. O
  10.         img.src = event.data;8 ]4 X' ~' U4 y+ a
  11.     });+ P- b4 ^" C# [! n! [
复制代码

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

% @. g! y! J2 a! i
4 i7 x  u) E) e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-9-29 04:56 , Processed in 0.130852 second(s), 20 queries .

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