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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  7 _# x/ G# L: l" h/ Q& l* T& |2 b* V
  2. //创建socket服务- v" [/ X6 O4 l
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);5 E3 G9 g2 H8 A: U
  4. //监听WebSocket连接打开事件
    2 O% t8 S  z+ ~7 E6 W# p+ t& a1 ?0 p
  5. $ws->on('open', function ($ws, $request) {
    8 s+ i* R3 C; b# t% m. q4 r% E( J3 ]
  6.      var_dump($request->fd, $request->get, $request->server);9 `- c/ W+ m* d; ^) v) E8 \9 p
  7.      $ws->push($request->fd, "hello, welcome\n");3 B4 `( \1 M$ L5 a3 u: N2 L3 Z
  8. });
    0 G5 T. C+ D- b  i6 t

  9. 0 U+ d/ I( n0 V; i% P3 l0 o
  10. //监听WebSocket消息事件
    : s/ w% D4 E: n  o* l6 j
  11. $ws->on('message', function ($ws, $frame) {4 Z( Y9 d. g3 B% }  h
  12.     //推送消息给所有用户
    1 Z' m' P2 L, D; P& ~4 B$ T/ q/ `
  13.     foreach($ws->connections as $fd){
    ( g1 b0 @' [6 @/ I
  14.         $ws->push($fd, $frame->data);! N/ K2 f& o) H
  15.     }4 j7 L' z8 Y( ^  m$ ]
  16. });3 V3 w/ F, }% S  J

  17. 1 @4 }# H  p5 `! ?; j1 E( C
  18. //监听WebSocket连接关闭事件( E7 }, D, R. L& T$ N; C6 H- ?
  19. $ws->on('close', function ($ws, $fd) {
    3 O% p7 I3 ?, |5 s
  20.     echo "client-{$fd} is closed\n";3 h( R+ N6 w& X$ S
  21. });
    ; P0 u1 W. y- {& y
  22. //启动服务1 N3 _3 Z. y, g; D; u2 D) ~9 H
  23. $ws->start();7 i; T; o3 L: g7 L

  24. * v0 U- V% Y. r$ s9 K9 h# l! Q
复制代码

) L3 r7 `0 V4 j! d7 i; M3 R$ }( hWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
, k  \; d& [2 H7 M

代码如下

  1. //连接服务器/ f/ Z& }# f) U2 t- P
  2.     const socket = new WebSocket('ws://lm.com:9502');" J+ [' }8 A6 N' S
  3.     //Connection opened
    2 ?" y: [" s! A( B3 \
  4.     socket.addEventListener('open', function (event) {; j1 R4 u/ G/ N3 l* w/ ?' Y
  5.             //发送消息给服务器9 m7 L# \0 g; |: v4 y7 P1 R) Q
  6.         socket.send('Hello Server! im websockt');
    9 C: }# y5 O/ `' B# }
  7.     });
      x, N3 t# i" z& P8 t* }
  8.     // Listen for messages
    1 c5 E( R0 G' E; a; v
  9.     socket.addEventListener('message', function (event) {
    4 [% b( Y2 l; h( J* e. ]4 \. @
  10.             //接收服务器返回信息
    3 {6 `; D9 l) q5 J/ M0 V
  11.         console.log('Message from server ', event.data);3 E/ \+ X$ @6 i/ t* Y4 i
  12.     });
    ; F: x! G8 c, g% t+ N

  13. & `/ y+ x" o9 j6 J
复制代码
伪直播主播页面" a& ?2 b4 P: U0 s

html

  1. <body>3 k! Q# b" t1 S& V* m$ Q7 i
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    " t) l. I; X+ A( y7 Q
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">  E+ o2 \9 P0 B
  4.         画布
    + P2 V$ C* W5 l) d, r4 a
  5.     </canvas>  u' {+ h( P, j* s6 `3 ]
  6.     <img src="" id="videoImage" width="350" height="700">
    4 T" ^9 R# x7 U2 e7 a* H) v
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    6 G5 S* R& K+ D" I
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    * D9 h1 k" a  s& E: \8 W4 w
  9. </body>4 @7 @3 a. G9 M, Y* @+ y
复制代码

javascript

  1.     var v = document.getElementById("myVideo");1 z( v  X6 R" ?6 E
  2.     var c = document.getElementById("myCanvas");
    $ T1 ~0 D( e! F' x- ]& h9 Y$ r
  3.     // var c = document.createElement("canvas");
    1 T: L: m5 N4 W4 C2 a
  4.     var img = document.getElementById("videoImage");8 |$ k) L3 M  A3 B6 t4 E% Q; x
  5.     ctx = c.getContext('2d');: S& P. y6 R5 p* b, e9 R4 u
  6.     var dataUrl;
    / F: \; I" e4 N* _/ F
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    6 ]7 r0 F5 @& K; x) V" P4 {
  8.     //Connection opened
    " N0 j: b9 O* b* |0 e+ s7 M
  9.     socket.addEventListener('open', function (event) {
    / k9 G& \* d$ H/ h  K
  10.         // socket.send('Hello Server! im websockt');! B0 h2 ^) I; O. ~  c( T
  11.     });
    . U0 |! C$ {! `- L9 a
  12.     // Listen for messages
    ) c2 e7 c0 A  Z
  13.     socket.addEventListener('message', function (event) {" E8 s) I4 p' r" y
  14.         console.log('Message from server ', event.data);# ^' z- f, M# e& ~+ `- _
  15.         img.src = event.data;- [' F' A# p3 V* e5 o1 e
  16.     });; O8 p% U$ p& S$ L8 d' [
  17. 8 H/ b& A- D& r2 h& L2 c, ~
  18.     function playVideo() {' u% q0 Q) ^4 P- M$ l
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    / F( ?4 z- J. C3 U
  20.         dataUrl = c.toDataURL("image/png");' @2 _. D+ m4 i1 u
  21.         // img.src = dataUrl;( W; `0 o% y6 r  [6 F+ ~9 w& _
  22.         socket.send(dataUrl);4 @$ ?. }8 _$ [( W2 h# e
  23.     }( Z7 E/ m6 J+ a' W5 @! _
  24.     var tick;
    & ~2 P4 ?$ n4 |. L# G2 \6 M
  25.     function aphla() {/ u3 k4 q0 I8 t' U2 J$ R+ V3 V& i' L
  26.         tick = setInterval(function () {" d/ I6 h  G, e0 I/ J3 u
  27.             playVideo();
    ; M- r( f; Y  U2 M: K6 V* D
  28.         }, 1);
    6 d7 [2 J, E/ a$ W/ F
  29.     }% `9 j; Q( V7 M6 [# e9 g5 P
  30.     function vdStop() {
    % H' l7 F8 }% k. C4 h7 D
  31.         clearInterval(tick);* Q+ M2 b4 ^! T
  32.     }( O; d- |) H4 @0 q
复制代码
用户页面- g- B/ j3 E) C5 s

html

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

javascript

  1. var img = document.getElementById("liveImg");
    + d1 @- z0 R' t: _; ]
  2.     const socket = new WebSocket("ws://lm.com:9502");
    * _. E& C, v: i2 F; E) `
  3.     //
    6 k6 O1 l, l! n0 P$ b( \
  4.     socket.addEventListener('open',function(){
    - q4 I* g' L: Q- h% n
  5.      socket.send('Hello Server! Im live.html');) e5 n$ T2 a* C( [7 H' t- X: u
  6.     });
    1 g, N) r; u& r& Y9 e* L9 G
  7.      // Listen for messages8 r2 w& ^* X7 N. \* H  z" H4 k
  8.     socket.addEventListener('message', function (event) {3 c0 ]0 j0 k% v  |9 O& s
  9.         //图片地址) l/ {' m8 f# q; m
  10.         img.src = event.data;
    % [# x# i# i5 R( W. u
  11.     });
    . W- k, s& V- e/ I8 |
复制代码

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


; P" b6 K7 c+ e$ e5 g; x0 S& ^% s, P$ V. s, u1 P1 G3 s! K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-17 16:46 , Processed in 0.141781 second(s), 21 queries .

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