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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    1 K; Y0 p& m* ]. i
  2. //创建socket服务( g+ I  D' V) x, Y! ]6 v
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    & {' L! W( J; Y/ |$ l) T
  4. //监听WebSocket连接打开事件
    # {9 j( x# r# S& \) s8 E( v
  5. $ws->on('open', function ($ws, $request) {# V- ^* @' w; f' ?( M
  6.      var_dump($request->fd, $request->get, $request->server);
    + m* R4 r- I- p/ Y6 J4 a# V6 T/ B
  7.      $ws->push($request->fd, "hello, welcome\n");
    + g# a- [' t# g7 ?' N* e3 G
  8. });: i5 d6 M# Z( Z: Z

  9. / \- [% L% u5 [# l) ]1 x5 m7 H+ J
  10. //监听WebSocket消息事件
    ) u6 Y6 t% H& x( v% _9 E
  11. $ws->on('message', function ($ws, $frame) {
    : m. \+ ]$ l( M1 P
  12.     //推送消息给所有用户
      Q& G8 y# G' P2 W5 \5 |+ k
  13.     foreach($ws->connections as $fd){
      T( v3 N7 ]$ u' w( ?' T4 u
  14.         $ws->push($fd, $frame->data);
    . n. Q6 w! v& p' Z
  15.     }* k7 q6 V: m& k3 W: r) l  R
  16. });
    % u' K1 m+ s2 {5 k: i

  17. ! b- T$ j/ c; H
  18. //监听WebSocket连接关闭事件
    3 Z# O6 @1 W& S/ [5 G2 ~* J0 C
  19. $ws->on('close', function ($ws, $fd) {
    " _$ R* i4 n  x+ r
  20.     echo "client-{$fd} is closed\n";& F8 u6 `* `9 o/ V# }& N8 S* g+ T3 T
  21. });
    & j% {* K5 K& k4 @
  22. //启动服务4 {  ~: B9 @9 R% Y2 U
  23. $ws->start();8 }: a. \: q" K, n- C" A
  24. , P: `1 Y8 [5 B) {* Z7 P
复制代码
/ V* O! u$ T- F3 H7 z, O9 L
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端7 T4 @. ^" l" d1 b% Y

代码如下

  1. //连接服务器
    ; E, ~$ p% p1 \$ f4 ^
  2.     const socket = new WebSocket('ws://lm.com:9502');6 _1 Z3 X6 V  v9 `8 |
  3.     //Connection opened; P8 g+ j' y9 h6 |2 v2 G
  4.     socket.addEventListener('open', function (event) {
    3 G/ I; [5 N' s. u( x" z: A' P
  5.             //发送消息给服务器
    1 N! i, b# k% Y* X5 |3 k) w9 t
  6.         socket.send('Hello Server! im websockt');
    $ e) H; D) G% Q+ A5 m* I* j
  7.     });
    3 M2 \0 p: F# F  H4 ]$ K3 E
  8.     // Listen for messages  x& H) O# U4 l+ k& p$ H
  9.     socket.addEventListener('message', function (event) {
    4 w: B: r% B4 f; t& p" j( `
  10.             //接收服务器返回信息7 c3 x. W% Z, `6 W5 ?) |% {
  11.         console.log('Message from server ', event.data);. e3 _" l9 p- o+ n1 J2 Z
  12.     });2 x; d, Y9 `1 M. J1 _6 W' t4 y
  13. ! W# U* U4 w& r& F8 U
复制代码
伪直播主播页面. U/ a; L! e7 D3 e- A

html

  1. <body>
    2 F$ E( M9 d2 B" b3 W
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>( A: w$ j; j7 H
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    ) T+ t7 n" w! M& L. ]
  4.         画布& T0 G, L! u* d( ?
  5.     </canvas>! O2 o6 J. u% Q/ I" p2 e' e
  6.     <img src="" id="videoImage" width="350" height="700">
    ) p7 q# I$ o9 j. a6 i. C0 m' O
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>- ^' H- x' @  G1 \3 M8 O
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    / z" G$ E& `! U* g* s) L
  9. </body>
    , b/ e  ~  C6 b& V! b1 t. Q' T, t$ L
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    & b4 b4 Y5 k- C" y& L
  2.     var c = document.getElementById("myCanvas");. r2 O$ v- m" X# W. r  ]- D' N" ^+ r8 k  C
  3.     // var c = document.createElement("canvas");$ g0 K7 K5 W& Q7 m
  4.     var img = document.getElementById("videoImage");1 [- X, J* H5 m9 Q
  5.     ctx = c.getContext('2d');
    / U3 G- H0 P+ ]  g8 {5 m
  6.     var dataUrl;
    + Z5 c3 @. V8 d7 F& Q
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    6 t+ D) `/ V+ @9 t: a2 d
  8.     //Connection opened
    0 ]% ~8 H: P9 S' _! X& V
  9.     socket.addEventListener('open', function (event) {. n  t3 D9 ]# B3 O5 f( t0 u7 G
  10.         // socket.send('Hello Server! im websockt');( }3 h' `. j3 u
  11.     });
    + o/ s! z5 Y, A5 G0 L$ Q' k! v
  12.     // Listen for messages
    $ `; o) b; \3 Q/ s$ n3 P% H
  13.     socket.addEventListener('message', function (event) {
    5 p7 b$ C& e" g+ H" Z, Y
  14.         console.log('Message from server ', event.data);
    ( H1 e/ N) q3 g
  15.         img.src = event.data;
    # ^8 ]( L6 ^  U/ P9 ~
  16.     });& V; r8 ]$ [5 ~& O% `
  17. 4 J8 D( j* x2 I7 l% P; _
  18.     function playVideo() {
    + ]' {( i/ D- D# R4 _
  19.         ctx.drawImage(v, 0, 0, 350, 700);( b4 F$ P* `7 D4 Q" Z& v, `
  20.         dataUrl = c.toDataURL("image/png");
    8 [* R! p3 A- m# R
  21.         // img.src = dataUrl;- Y1 I5 ]1 A/ ?* p
  22.         socket.send(dataUrl);/ B' ]3 ?$ `4 b/ h+ U
  23.     }' I/ R3 x  o& o" k
  24.     var tick;1 g# ]: n; i4 k# b+ f8 K
  25.     function aphla() {1 l: g! z' z* Y/ ?( u' k
  26.         tick = setInterval(function () {( j& m2 K' ^& V
  27.             playVideo();
    * Y9 e; S" p; f$ W
  28.         }, 1);
    1 G! b, Z0 x1 c/ W8 J) [7 O. y
  29.     }
    0 G: Q$ F# q! L; `0 h7 Q$ s+ `, u. U& Y
  30.     function vdStop() {
    ( N# G1 [" ~  g
  31.         clearInterval(tick);( T: T+ E2 l' I& g  H8 I
  32.     }6 {% ~) {7 F! n3 L0 m
复制代码
用户页面
' F( E) c) {5 t- m* J

html

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

javascript

  1. var img = document.getElementById("liveImg");+ u; h% E# L! E! }
  2.     const socket = new WebSocket("ws://lm.com:9502");5 D! h$ J) d' S; R' Q8 W! A
  3.     //
    1 t  ]0 ]8 F! C
  4.     socket.addEventListener('open',function(){8 _# A) c7 f: {3 v6 @# H
  5.      socket.send('Hello Server! Im live.html');
    8 z. \1 |/ x9 `9 @+ E6 e  D
  6.     });& b' J* X* G  [* C% Y  M7 n8 ]9 T( U
  7.      // Listen for messages. H; \* [  U* i9 d3 \7 w7 v
  8.     socket.addEventListener('message', function (event) {
    , c) M: A. ]! W/ Q: X8 R
  9.         //图片地址3 ~' `( [' n$ l& z  ]. m& z* Y
  10.         img.src = event.data;/ Q2 {* H3 V3 [
  11.     });
    9 ]9 {/ }& k( H3 N0 f! i
复制代码

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


$ ?- a$ [3 `7 L. m; V2 X/ J+ a3 P. _% H- Q" H$ X* X2 H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 11:39 , Processed in 0.060359 second(s), 20 queries .

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