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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    : T7 V- X5 Z4 \6 G9 T
  2. //创建socket服务9 m5 @+ H  C6 j
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);  j. ]5 J7 j/ Y* K
  4. //监听WebSocket连接打开事件
    * u) P! }2 x# s
  5. $ws->on('open', function ($ws, $request) {
      V4 Y& w# Y& S) z9 e$ l
  6.      var_dump($request->fd, $request->get, $request->server);1 d8 o: N9 e# H) G
  7.      $ws->push($request->fd, "hello, welcome\n");
    2 s5 q4 g1 _- z1 ~* P/ A& W
  8. });
    * _- m- ]: E( o; y. R" h9 k! X

  9. ' f! i% @$ L5 u+ A
  10. //监听WebSocket消息事件
    7 K+ ^; v. l( T: s/ f: W! Z$ ?6 @
  11. $ws->on('message', function ($ws, $frame) {
    0 U+ Q* |* }% g8 _: A
  12.     //推送消息给所有用户& a) V0 a' a4 k/ Z; w% D" Z
  13.     foreach($ws->connections as $fd){
    1 c* P8 g2 P5 l! X
  14.         $ws->push($fd, $frame->data);# `8 f  O4 ^& o/ @% k! C- q" R/ h8 q
  15.     }
    ) K% R/ f3 h7 X, \, R
  16. });
    : ]: ]3 u3 @8 k6 K0 D# F

  17. 5 c& l6 \- i( C
  18. //监听WebSocket连接关闭事件' K6 y2 q2 p9 {8 q3 _& `# b: G/ e
  19. $ws->on('close', function ($ws, $fd) {, L" h- v# Z9 V6 a
  20.     echo "client-{$fd} is closed\n";( [. U3 |) Q" q  Z9 M# H1 O
  21. });
    : U" u! p# @/ Y3 m7 X
  22. //启动服务
    , b( }7 t) {! C9 \0 B/ {7 s
  23. $ws->start();+ O' P# _5 H6 D0 H+ }6 V0 Q. T2 c8 C

  24. 9 H) w  T/ t$ k. \/ |4 o+ i% c. O
复制代码

* q4 b* |- c* b7 W/ E' MWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
. R5 F9 t0 c; j8 }. a/ [# [+ e0 s4 Z

代码如下

  1. //连接服务器8 F8 I9 Z0 i4 u! c! y2 T) J5 H
  2.     const socket = new WebSocket('ws://lm.com:9502');
    3 d& c' b" o# s& Y
  3.     //Connection opened7 q5 w- h/ G  _, A5 F
  4.     socket.addEventListener('open', function (event) {5 w6 O/ @8 j( D& Y
  5.             //发送消息给服务器! ~  `5 z" W3 [9 C  T' x1 e2 U
  6.         socket.send('Hello Server! im websockt');
    $ ^& C! _1 K) Z( I; F. Q) \
  7.     });
    + d! R% c2 m( g+ `- j
  8.     // Listen for messages
    3 U# s# l) k4 s
  9.     socket.addEventListener('message', function (event) {) y/ |3 F0 i( v* h1 \% H$ r
  10.             //接收服务器返回信息
    ( K, Z# W9 [( L4 W6 B
  11.         console.log('Message from server ', event.data);
      Q# H2 V& ?/ ]
  12.     });# y9 U4 r; Z5 ?7 J+ T2 f
  13. " a! M% B2 Y8 e+ p; E9 G7 g
复制代码
伪直播主播页面
* M4 z) X/ b( x6 {  I+ |

html

  1. <body># S6 {! M1 X/ c6 t7 N
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    ( U2 {8 r1 O1 a' ~+ @
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">: \. ~+ t" v% j- H& L
  4.         画布6 b1 O8 a3 I0 h- \
  5.     </canvas>
    ' T7 j) P+ L8 Z/ ^& y2 B) J
  6.     <img src="" id="videoImage" width="350" height="700">
    1 N7 Z  b! i" }  M6 F
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    3 W) B& I2 @8 J* H8 g" }& g
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>; ~0 |7 n; g% }, G' }) _2 V- B! s7 S" ]
  9. </body>. p/ g9 G7 q0 U" R6 q
复制代码

javascript

  1.     var v = document.getElementById("myVideo");4 K# C1 H; o$ l. n' F! e  ^* z
  2.     var c = document.getElementById("myCanvas");0 d4 J0 v8 ?0 I* i* R4 j
  3.     // var c = document.createElement("canvas");
    1 ^* B! e3 l* Y) S
  4.     var img = document.getElementById("videoImage");& a& n, G) Y& P7 J. L% @
  5.     ctx = c.getContext('2d');
    1 C5 r/ p2 R+ ]4 X- `/ }# I
  6.     var dataUrl;) F8 V( U# O2 R4 p4 E4 G1 T
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    ; U( [9 t- ^7 `! m, W2 v
  8.     //Connection opened2 k8 ^- U( W: r) P! i& w
  9.     socket.addEventListener('open', function (event) {# n6 H  R4 c8 ]; f
  10.         // socket.send('Hello Server! im websockt');
    ) a  Z6 X% k9 M( |! N
  11.     });
    ) y" c& Q& H+ |$ s$ C/ T
  12.     // Listen for messages7 z0 D7 n& R! P- e$ k
  13.     socket.addEventListener('message', function (event) {
    5 m3 W+ Y: t0 y% k6 U7 V1 ]# b8 Q
  14.         console.log('Message from server ', event.data);" f$ C6 P$ b" L
  15.         img.src = event.data;
    / H+ Z7 r% A( n% M& w% h
  16.     });6 u0 k. w- ]: p  \8 m( l

  17.   l1 A( p4 u6 u& g- R% t& d
  18.     function playVideo() {
    * L- e% w+ R& ]
  19.         ctx.drawImage(v, 0, 0, 350, 700);# M- k& K0 v+ C4 u
  20.         dataUrl = c.toDataURL("image/png");7 G2 H7 F  [# a
  21.         // img.src = dataUrl;3 s" o3 [# J1 x3 b1 {
  22.         socket.send(dataUrl);
    7 g7 _$ p3 a% L+ b# S% U
  23.     }' j3 @3 L# B  C
  24.     var tick;
    - Y3 v2 A* S, F0 d0 s
  25.     function aphla() {
    ' @* h3 U- U+ P% y/ {# N: I+ h
  26.         tick = setInterval(function () {/ y; v4 w- {0 i, G
  27.             playVideo();
    / [5 u7 R5 `. H2 A+ x* b# V
  28.         }, 1);
    . K% k8 i' [+ ?& H; `
  29.     }
    $ w/ Y3 T7 A! J9 l9 e. P: n- g4 O* Q
  30.     function vdStop() {
    + a' x7 k  U* N
  31.         clearInterval(tick);
    ; B; o! y, {& S' R- s# p0 H( Y  L
  32.     }
    ) b, c0 }# J, @7 J7 \
复制代码
用户页面
# `+ N! y9 d9 k  i7 W

html

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

javascript

  1. var img = document.getElementById("liveImg");
    4 E9 r/ U" Q- P6 ~' E# D
  2.     const socket = new WebSocket("ws://lm.com:9502");7 N/ C% E1 d4 m  B
  3.     //) F' D$ }) q3 b# y- N
  4.     socket.addEventListener('open',function(){3 J9 _7 y) P, j7 S0 Q/ P
  5.      socket.send('Hello Server! Im live.html');1 K* Z$ d. y, p+ S. P5 w
  6.     });4 |- n) Q7 Y7 K. x( G/ y6 Y
  7.      // Listen for messages
    ' Z0 Z4 B, O7 T- s. t
  8.     socket.addEventListener('message', function (event) {$ V; y3 g" V6 R8 t' N! ?
  9.         //图片地址& I% ~7 D, e( D# n. G, O# \: b
  10.         img.src = event.data;$ c: m9 e( J3 b
  11.     });. R# M+ q5 X0 Z5 ^2 P% l
复制代码

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


% J, A) |2 X+ P! k) Q7 \1 `% }1 E2 Q* Z# ^0 @
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-20 03:22 , Processed in 0.155883 second(s), 21 queries .

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