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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    5 X. l$ V6 }9 E/ ?8 V
  2. //创建socket服务
      ~) ?1 Q; U& D
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);+ {  q% Q' @1 {, K# ?
  4. //监听WebSocket连接打开事件
    9 v  R) ^* S# l$ {
  5. $ws->on('open', function ($ws, $request) {5 x0 F% D9 q4 ?
  6.      var_dump($request->fd, $request->get, $request->server);; m( ?* d$ u9 V* x# V3 U
  7.      $ws->push($request->fd, "hello, welcome\n");5 u/ ^- e7 i7 j
  8. });
    * ^2 i  F5 r+ T! i3 x: y  ]5 x" N% t

  9. : F9 E  p# |& @+ u/ h" o- D
  10. //监听WebSocket消息事件
    8 n/ S( t# u' E# r, D
  11. $ws->on('message', function ($ws, $frame) {
    8 v' m% ^% d$ e
  12.     //推送消息给所有用户
    1 A% J/ `; d- u" S
  13.     foreach($ws->connections as $fd){) u  H0 H. x* Z( y7 Z& [% x
  14.         $ws->push($fd, $frame->data);
    $ y* R7 H9 M4 z6 P. g! ~
  15.     }1 L; [7 W; Q9 x5 Y7 v6 S, ?
  16. });
    , Y) m* n+ H4 W6 x: N8 `( X

  17. " g0 X8 p  j* c' p+ F% ?
  18. //监听WebSocket连接关闭事件
    : c+ r' d" E) _5 e5 t3 x
  19. $ws->on('close', function ($ws, $fd) {
    ; a5 N) G' W* t, o/ B& J
  20.     echo "client-{$fd} is closed\n";0 v  A2 j) _6 i5 t
  21. });# q# `1 A$ m9 T
  22. //启动服务
      \+ C7 }0 E. K/ R5 ]$ C
  23. $ws->start();9 V2 N* I# `% |. H0 O

  24. 6 V; c+ b( W! t; W* b, e) n
复制代码

/ @  ~' V! Q' m7 i- i- q# w0 yWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端9 @; h& v" t3 m6 F9 p0 l& Q* Y' q& t, y

代码如下

  1. //连接服务器
    9 w6 `9 s, v  K$ q" e* a
  2.     const socket = new WebSocket('ws://lm.com:9502');2 a8 [3 K3 a# |# g7 B+ A% F) S
  3.     //Connection opened7 [1 N& k4 ]" }% n
  4.     socket.addEventListener('open', function (event) {
    - U1 y: f  N9 f( E0 k% f
  5.             //发送消息给服务器7 M$ E+ D- P/ F3 p( v/ T% k7 R
  6.         socket.send('Hello Server! im websockt');
    6 c# M( d- m" O
  7.     });: ?0 t# ^" {! G2 d6 f: t. {1 }
  8.     // Listen for messages* g5 p. P; u* n' O8 k+ M) c7 K
  9.     socket.addEventListener('message', function (event) {+ K  n7 P* G: f5 a5 v; K1 `+ F
  10.             //接收服务器返回信息8 I; {  c+ I/ ^$ u* R2 X
  11.         console.log('Message from server ', event.data);. p: W% P+ n0 n
  12.     });/ @( a+ q' a7 a4 A* J
  13. 0 e* M6 Z/ Q' Q- S' F; k
复制代码
伪直播主播页面
2 J) r( @* ^! F7 [1 M/ }

html

  1. <body>5 l0 J: V/ j  }5 O5 U; G) o
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>0 J! m7 Q! V4 ~& S1 O9 Q
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">8 T. @" I; O. Z
  4.         画布
    9 c* ~8 Y/ @: y5 q$ b) a2 r
  5.     </canvas>- ?8 U0 B! }6 X( z! y2 ]
  6.     <img src="" id="videoImage" width="350" height="700">$ e/ C3 [( v$ _+ E1 |6 m- a- q# [
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    + e* M, Y/ ?% Q- X! _! `: y8 N
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>' p0 ~+ H4 z, o0 M, W# W- ?8 ]
  9. </body>
    4 {: i& }, L& w4 @# J* X
复制代码

javascript

  1.     var v = document.getElementById("myVideo");" k" r, D: s" ~, O
  2.     var c = document.getElementById("myCanvas");, e2 \6 I, w" l
  3.     // var c = document.createElement("canvas");
      V) h9 Z  J/ b( k6 v
  4.     var img = document.getElementById("videoImage");% B2 C; |/ B" d" [
  5.     ctx = c.getContext('2d');
    ( {0 C4 t1 n/ @7 x, K
  6.     var dataUrl;9 T+ [2 ~( m* Y6 `; z5 O, T, i
  7.     const socket = new WebSocket('ws://xxxx.com:9502');! s1 S8 _' K+ ~" g
  8.     //Connection opened
    " x7 j. |9 g) K0 U0 t- u+ K$ E
  9.     socket.addEventListener('open', function (event) {
    0 _8 E6 `9 d: K+ V8 }, {
  10.         // socket.send('Hello Server! im websockt');- N1 |; r- w; }  ?% b& u9 |+ @) v
  11.     });- P( [$ Q+ @% B% c4 T- P& Y! W% @
  12.     // Listen for messages1 \' Q8 u: J2 V+ S0 I
  13.     socket.addEventListener('message', function (event) {
    ( o$ h) W# f  m) D$ C( L) K, W, t
  14.         console.log('Message from server ', event.data);7 @8 y$ G  y. Q) [" M0 D
  15.         img.src = event.data;& W, s2 n( E0 d
  16.     });
    7 k. \- x. i& |/ ~; L

  17. 6 U$ w. |# w# {
  18.     function playVideo() {' [' h' C8 |+ ~6 `/ Y( y
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    ' x9 z  M* n3 C6 P1 i6 P3 Z; [
  20.         dataUrl = c.toDataURL("image/png");4 V/ A$ f2 ]% U
  21.         // img.src = dataUrl;
    % _1 i: `6 _9 B0 x' v+ L, \( h5 E
  22.         socket.send(dataUrl);2 M: a6 N" V8 v6 l; E) R
  23.     }- V, |6 t8 P( c1 Z& R1 @1 `! [
  24.     var tick;
    7 k0 _- S, q& A6 i% I- h
  25.     function aphla() {) ?0 u. Y' W; ?% U6 C3 A) E: {
  26.         tick = setInterval(function () {
    9 f( y' _; {, \. I# g/ j
  27.             playVideo();$ i' m, T! S# p2 ]+ T  J
  28.         }, 1);& p, b; [' b  l' Q. J; w
  29.     }$ q% h) T+ m9 r0 ^: e; \' @% f
  30.     function vdStop() {
    & b9 p9 Z4 W0 j1 c; U) K9 v
  31.         clearInterval(tick);; ~& U" d% [" e
  32.     }
    & r4 c$ Q) T% S
复制代码
用户页面
6 n7 w; h5 ~! z6 A& m# U

html

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

javascript

  1. var img = document.getElementById("liveImg");; ]. p# w  ~9 {" p( w% J# M
  2.     const socket = new WebSocket("ws://lm.com:9502");/ a  S4 T$ K- m
  3.     //
    2 ?0 A0 A) t3 E8 o
  4.     socket.addEventListener('open',function(){
    / V* R. c9 b7 s0 u, ~0 ]/ d4 {
  5.      socket.send('Hello Server! Im live.html');$ O9 j* R# j* x6 [6 w" u* {
  6.     });% ^: u8 y' L1 O% N
  7.      // Listen for messages
    5 ]$ \0 t3 Q  U
  8.     socket.addEventListener('message', function (event) {
    6 f% m/ J( F# I
  9.         //图片地址2 D/ q8 M5 @: x  Y! u" z
  10.         img.src = event.data;* v, R' @+ r7 p5 ?' C# @
  11.     });# @% @! E6 c8 v" V
复制代码

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

9 F4 y3 z+ p9 x
* R* y* g8 h2 Q4 C" j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 10:05 , Processed in 0.131967 second(s), 20 queries .

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