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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    + [# W  K% g3 k" K" Q9 ~0 p! {
  2. //创建socket服务% X* ]. u! d2 n% i" k+ E
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    % A! x; x# n0 k8 a4 n: w
  4. //监听WebSocket连接打开事件
    - Z5 x2 R- c- I+ d3 Y3 f
  5. $ws->on('open', function ($ws, $request) {6 h2 c6 b' l9 K: b0 S# \; C# O
  6.      var_dump($request->fd, $request->get, $request->server);; g( U; l, b' g4 n- ~7 g- ]4 L
  7.      $ws->push($request->fd, "hello, welcome\n");' Z  A1 O1 a7 {" t/ b( X
  8. });9 s5 y; v/ C2 N
  9. 9 D2 p) p' R' o5 F: k1 ~- v0 Y
  10. //监听WebSocket消息事件2 Y% T) a" H+ n& h; h; V
  11. $ws->on('message', function ($ws, $frame) {! \$ S6 u( ^* U* [) A* g, }) g
  12.     //推送消息给所有用户$ s" h; S( L! ?. G* l3 y$ x
  13.     foreach($ws->connections as $fd){
    7 }. P% |+ K( y5 v5 E& }, u% m  b
  14.         $ws->push($fd, $frame->data);
    ) |& ?; k4 a# V2 R/ y) o
  15.     }1 E( P  D# ]1 c4 y4 Y# i( @
  16. });6 ^, m2 f9 d' s& {+ o. {
  17. % h- Y  x5 i6 r% x( W
  18. //监听WebSocket连接关闭事件
    - e* [0 L/ d* C! B& R7 z
  19. $ws->on('close', function ($ws, $fd) {
    # a3 Q- s5 c8 ~2 K* ^5 z2 {/ R
  20.     echo "client-{$fd} is closed\n";7 J$ ~) h' I& R0 J
  21. });% _/ G' y9 j( `! g2 u
  22. //启动服务
    & R  P/ h+ U8 @, \
  23. $ws->start();; `& w' X) E% H: K" |1 E

  24. / ]% @9 Y8 k2 e. u+ G% R6 C
复制代码

1 h+ {2 W, [, ?' F  A$ @3 RWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
* j8 m9 L+ e2 e

代码如下

  1. //连接服务器7 m, z& E( ?* Q) f( F
  2.     const socket = new WebSocket('ws://lm.com:9502');
    : ?+ v( k( V$ \
  3.     //Connection opened& b6 V& R( g% p# }5 _* Z
  4.     socket.addEventListener('open', function (event) {
    : D. E+ ^' R) x2 ]3 B2 _1 D2 `* i$ L7 _
  5.             //发送消息给服务器
    * ^8 P% ]1 D0 Q; w
  6.         socket.send('Hello Server! im websockt');
    , N$ A$ K& e5 u2 k( x
  7.     });
    3 v( G( R  T  @0 d( }, }# ]7 \  E
  8.     // Listen for messages
    : F. M: _0 X9 ?! q" n
  9.     socket.addEventListener('message', function (event) {; `# i/ a% J2 m/ i, W8 k
  10.             //接收服务器返回信息; `5 A1 w$ |4 H0 \
  11.         console.log('Message from server ', event.data);' Z1 b, i9 K2 _6 O8 C
  12.     });! s4 `( @/ w/ a7 W" t& P! F( V7 ^+ v% O

  13. ) x8 G2 p2 C3 d# U1 u# ~2 Y
复制代码
伪直播主播页面
0 f- `" t# K- {+ R; T( O

html

  1. <body>
    8 B5 s8 k3 y, B! Q+ U3 V, v; H
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>8 |2 c5 R/ Y% l9 a4 a% B# @
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    2 c- U- T( ~. d8 v* a4 t
  4.         画布( L7 ~0 ~- H& @6 u
  5.     </canvas>9 J) C0 N2 p* [5 p* t
  6.     <img src="" id="videoImage" width="350" height="700">
    3 s. H# P; v6 O2 V
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    7 k! |6 @4 a( L" V$ ]: U
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>2 {4 [7 `& F- D9 r8 u! D7 ^
  9. </body>- d4 C7 _8 J) H" T) j
复制代码

javascript

  1.     var v = document.getElementById("myVideo");  U6 p; [8 F! X1 E, J1 G
  2.     var c = document.getElementById("myCanvas");- \0 a( }' ^$ \; |: m- Y) y& d+ N
  3.     // var c = document.createElement("canvas");
    7 T- \" F" g6 V$ z6 ]
  4.     var img = document.getElementById("videoImage");$ G: V, c( {' ~% v
  5.     ctx = c.getContext('2d');
    9 k0 V: X; c! d& B& c6 ]
  6.     var dataUrl;
    $ }( O% b6 X8 `9 t+ W
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    2 [/ P4 P3 h) c+ x# F" s
  8.     //Connection opened
      S& t+ T% z. b
  9.     socket.addEventListener('open', function (event) {
    4 G' \3 S7 V) B7 k: i& z3 n
  10.         // socket.send('Hello Server! im websockt');
    1 h1 A0 M& z! p2 Q' z
  11.     });
    . S' h& j- [: u$ w5 I
  12.     // Listen for messages. P/ t* m9 i& W1 M, {
  13.     socket.addEventListener('message', function (event) {
    % m4 r: p6 C  Q$ s/ M% q. V) J
  14.         console.log('Message from server ', event.data);* x; r- O/ q' P( {5 e
  15.         img.src = event.data;7 T  d$ W) n* E1 M  L7 E
  16.     });6 F. c2 g4 X+ `+ n4 C2 p+ e

  17. ) F- [. F6 x! y, ]5 Q# F: [
  18.     function playVideo() {
    . u0 |6 j6 z$ L# x8 z( m
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    8 \6 F$ v" R4 j2 w
  20.         dataUrl = c.toDataURL("image/png");* m) r3 i! s* K7 W( Y
  21.         // img.src = dataUrl;
    0 F- i: ?' q* ~2 h: F. w* G
  22.         socket.send(dataUrl);# ]+ E- _: D% [2 j$ K* \6 M
  23.     }, K/ F  {% y$ d0 Q' f
  24.     var tick;
    : O6 k* |" u) _  w, }; j4 O
  25.     function aphla() {
    % ~: v+ A2 [5 o  j- F$ |
  26.         tick = setInterval(function () {
    1 `# x  }. |, {4 D6 q" N6 W5 Z) {
  27.             playVideo();
    4 G; A/ g1 v. a
  28.         }, 1);7 |; ~0 o' L8 e7 n# C
  29.     }
    , p% Z, N, k. X$ |+ p0 ~" ?
  30.     function vdStop() {2 ~* q" m, i; n( f- G( u7 C
  31.         clearInterval(tick);
      Q( \* i  h) D
  32.     }" V( g. a+ F8 d! U( }, Z& ~% g. _; ?% _
复制代码
用户页面
  @$ O3 M; ~( z

html

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

javascript

  1. var img = document.getElementById("liveImg");& f. I0 c8 f; \$ H8 w
  2.     const socket = new WebSocket("ws://lm.com:9502");
    7 A" R) I$ P5 f* E% x
  3.     //: q% N! L/ G& b7 I4 k& f
  4.     socket.addEventListener('open',function(){
    ' _. Y/ v! v2 O9 D  G
  5.      socket.send('Hello Server! Im live.html');
    - [- }. }" _' o7 ~- `" C+ O
  6.     });$ F0 B( O0 G) o$ b
  7.      // Listen for messages/ L5 a! X2 l% M* _7 O% P9 i3 q
  8.     socket.addEventListener('message', function (event) {
    3 w1 e: ^( @( _3 T
  9.         //图片地址; @0 J$ I; h7 S! ?, Y
  10.         img.src = event.data;
    4 K5 T# d2 h. p0 a0 |
  11.     });
    0 h3 V4 e. V0 S. x
复制代码

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

# k2 j3 [$ E  K" h/ F1 h+ j

9 o9 a2 k+ _! J6 G# n5 |/ ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-18 18:27 , Processed in 0.120255 second(s), 22 queries .

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