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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  1 f  C) m0 ^, c7 B6 S7 ^. S1 Z0 t# ^
  2. //创建socket服务
    % x3 R) e7 r" y! ^4 J, s
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);4 O4 |) d/ N, ]' T" x
  4. //监听WebSocket连接打开事件  h+ m* x3 d- z" R: K" K
  5. $ws->on('open', function ($ws, $request) {7 p. o" G8 x$ ?* g
  6.      var_dump($request->fd, $request->get, $request->server);
    & s' t$ T6 a% ~8 `% F
  7.      $ws->push($request->fd, "hello, welcome\n");
    & Y5 W4 h3 P, N) S+ M
  8. });
    / h0 d+ k! p) j* F# E2 B

  9. ( @' P4 Z6 p/ ~8 L
  10. //监听WebSocket消息事件7 U% Y$ S, I$ g, F
  11. $ws->on('message', function ($ws, $frame) {
      m, A3 y) y& \- r  Y0 l$ i# l
  12.     //推送消息给所有用户
    ; Q" n  o: L% @. M
  13.     foreach($ws->connections as $fd){
    # m1 o8 {" A5 S0 Z$ m
  14.         $ws->push($fd, $frame->data);
    $ Z3 d6 c, S2 \3 s; ]8 a/ v' Y7 g9 J
  15.     }
    & {2 q. k4 S( t* }/ U; N2 k
  16. });8 B% d; f- D0 r2 q" c' q9 {5 `! H
  17. 7 E" n% l; t6 S; H
  18. //监听WebSocket连接关闭事件
    9 R- G# F- V* x9 _- J  q9 L
  19. $ws->on('close', function ($ws, $fd) {
    9 ?) {$ [6 |  d0 G5 n
  20.     echo "client-{$fd} is closed\n";+ _: l- }* ]- L% Q4 o; z( p
  21. });
    1 M5 W$ T% _: K3 s8 ]& D
  22. //启动服务" p, I8 F, Q' S; K7 K
  23. $ws->start();0 l7 A, p& r. j9 y5 _7 |' o; c

  24. 5 ~6 n6 N2 g/ U. V
复制代码
1 C0 t- R% R% J" P" _
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端6 m4 i  X/ j: z4 Q9 F7 l6 Y1 B  {* v

代码如下

  1. //连接服务器( r& x# [9 t/ P( x+ `% F0 d
  2.     const socket = new WebSocket('ws://lm.com:9502');
    5 k) J4 `9 y# E# O4 V( l
  3.     //Connection opened- W* Q  y! Z9 _/ `' i7 W/ L9 x
  4.     socket.addEventListener('open', function (event) {5 p4 B6 z( c  c  Q
  5.             //发送消息给服务器& j1 ^$ T; T( q- ?# g
  6.         socket.send('Hello Server! im websockt');% ^# u4 F7 M% A4 |: I
  7.     });7 L; r, w8 V0 X/ o' b
  8.     // Listen for messages& F3 A4 M8 _! e, S* H
  9.     socket.addEventListener('message', function (event) {
    " Z9 X2 f' Z3 H) g% P$ R6 Y
  10.             //接收服务器返回信息9 y2 e0 n' L: V: T. Y1 z
  11.         console.log('Message from server ', event.data);# n9 n/ U6 A$ g  h% Q
  12.     });! I, y- ]0 I1 i1 S9 P1 {

  13. + x  o* r. Q$ v( M; E6 h6 F
复制代码
伪直播主播页面
, n( K5 c$ @- ~" M

html

  1. <body>7 N) g' G! z5 ]! a: v, o
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video># m$ f1 ?8 f  y: r2 Q
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    * g/ f3 S' X# P) d, D2 {4 j% }
  4.         画布
    3 g( B# {* N2 t8 q  y# z
  5.     </canvas>! {0 F8 z/ {- [8 W1 n
  6.     <img src="" id="videoImage" width="350" height="700">" F5 ~: Q! e) X' @4 z0 u0 H
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    * L9 s, g. e# O  _- A
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>- H9 q( E% h4 v# u
  9. </body>
    & `! Z, C. C: Z. _& L$ H
复制代码

javascript

  1.     var v = document.getElementById("myVideo");: G0 L0 T" t% ^% H9 n9 V
  2.     var c = document.getElementById("myCanvas");
    8 D( \# q6 N& q: A) E, K
  3.     // var c = document.createElement("canvas");
    - U% \4 Y( R( d7 f
  4.     var img = document.getElementById("videoImage");% F4 b+ m2 p1 k9 }
  5.     ctx = c.getContext('2d');! E7 t- r  a4 Y# S; x; D1 w
  6.     var dataUrl;, n# c* w. q  ?3 e1 K
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    . p% u) o9 R( Q! I6 V( H2 P1 v
  8.     //Connection opened
    6 L! O5 t% z3 B2 O1 q2 K3 g
  9.     socket.addEventListener('open', function (event) {
    5 W: U- @5 i: n% C5 |% j( L+ \
  10.         // socket.send('Hello Server! im websockt');; z6 ^) a, B: _/ V# Q. d7 b8 U6 m
  11.     });( M  l7 @/ p" {0 Z  v
  12.     // Listen for messages
    ) p' H* L' t2 V+ Q* p# D) z: Y
  13.     socket.addEventListener('message', function (event) {3 d; b5 ^1 p1 _% l/ A  H  `
  14.         console.log('Message from server ', event.data);
    6 S! X+ O7 I: L+ V, O
  15.         img.src = event.data;8 Y0 t; @( K- p  F! ?
  16.     });
    3 I6 M- X( o! w: U) P  [
  17. $ N% k) S6 @* R) S  M8 d$ d
  18.     function playVideo() {8 [: e5 ]) D. p/ M' o% C3 }7 u
  19.         ctx.drawImage(v, 0, 0, 350, 700);) z& e; D/ p* q; {4 y, }: I
  20.         dataUrl = c.toDataURL("image/png");
    / K; o7 _8 h/ T. O# a
  21.         // img.src = dataUrl;
    - F7 z$ y+ C8 U3 Q, U  h. c
  22.         socket.send(dataUrl);; x  r  ^4 P0 Q) B  E
  23.     }
    7 P  R5 m' C, T( _% k
  24.     var tick;
    & Y( `0 u) ]" o  m+ Y  B
  25.     function aphla() {8 I4 M0 W% ~4 C, z: S
  26.         tick = setInterval(function () {% S( H7 Q9 v; z8 D6 R
  27.             playVideo();
    + P; \1 e5 x2 c1 a: M) ]) |. l
  28.         }, 1);
    4 S5 Q. Z9 J; ~" f4 l8 F
  29.     }
    % v6 M; I% O5 {( x5 U  @
  30.     function vdStop() {- V! }2 n" m; I" @
  31.         clearInterval(tick);
    7 Q1 {% M+ s5 e; {' r1 P
  32.     }5 p; z  B# Y" `5 N" X
复制代码
用户页面' F5 T% [6 C) y0 }* e) w; U4 j) e

html

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

javascript

  1. var img = document.getElementById("liveImg");
    # s( x# }0 ]2 ?! C
  2.     const socket = new WebSocket("ws://lm.com:9502");( Q( q% M- n' ^. k6 t
  3.     //' P5 K% f. ]; p
  4.     socket.addEventListener('open',function(){9 i2 M& c' m4 O/ r
  5.      socket.send('Hello Server! Im live.html');" ~+ G) D8 I3 ?% [$ D
  6.     });8 X6 j9 |( c( C% C& @/ i% J
  7.      // Listen for messages
    4 y" \. _" L$ X1 T
  8.     socket.addEventListener('message', function (event) {( U* E% A( L8 ]1 d) y7 P
  9.         //图片地址. _0 X9 I' N) m+ }
  10.         img.src = event.data;8 \# [1 X. U! R; d5 ~4 A6 x! z2 [
  11.     });
    1 F; i* m) O$ _  g- l, _( Y
复制代码

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

; r# E7 d. h2 T) T) p+ ^  W5 P  U

5 J5 p( w) k$ ~' ~+ W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 13:35 , Processed in 0.062878 second(s), 19 queries .

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