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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    7 {$ b: R& t0 }8 T5 Q8 n# Q& P
  2. //创建socket服务
      N- i8 A* u. [% v
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);" }; }7 A; q6 n2 g
  4. //监听WebSocket连接打开事件7 s+ Y1 J" X/ j/ q4 k6 I! \1 s5 Q
  5. $ws->on('open', function ($ws, $request) {
    ) @. U$ o# b+ J
  6.      var_dump($request->fd, $request->get, $request->server);- O& N! l# ^6 s6 R  f% ^
  7.      $ws->push($request->fd, "hello, welcome\n");
    1 r% Q" ~0 y: ^  k
  8. });  q+ \" I2 _8 [( c. Z4 {8 h: W" a

  9. # l& n! B- q" B; M. s$ o
  10. //监听WebSocket消息事件
    8 Z1 G- S  N7 ]/ W
  11. $ws->on('message', function ($ws, $frame) {
    * A: n5 c: \# n1 w
  12.     //推送消息给所有用户
    - k0 c# G' h1 L8 Z% t
  13.     foreach($ws->connections as $fd){9 O. t3 h9 q# e) x8 o4 C- M, D
  14.         $ws->push($fd, $frame->data);
    - d! V( ?* O. W4 T1 m
  15.     }
    & O! w5 X; h4 C4 ~
  16. });2 E: @0 k# a8 d$ i

  17.   I1 Z+ x; r2 k
  18. //监听WebSocket连接关闭事件
    ) ~$ s, p) j* |" j/ b
  19. $ws->on('close', function ($ws, $fd) {  D. j& A6 ]5 N0 L
  20.     echo "client-{$fd} is closed\n";
    ' r: M- C+ ?6 W) y8 g1 g: X! _
  21. });
    7 ~8 `( K2 `! k9 E# p
  22. //启动服务) ]! z6 ?+ l/ ~/ t/ x. H
  23. $ws->start();
    + B3 e( t: }$ J7 ]( N1 n

  24. ; z$ e' V# D8 k0 o' h, A. T
复制代码
# y. `: S- {3 C9 d
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
* c0 d! s9 W( J

代码如下

  1. //连接服务器
    , P( W7 g. s. ^* ?/ A  J  H
  2.     const socket = new WebSocket('ws://lm.com:9502');" l: }! l& a2 j/ |
  3.     //Connection opened( w. h  {) C5 Y' x! l' [7 z9 ~% s
  4.     socket.addEventListener('open', function (event) {
    1 z7 A6 Z; D+ \6 n: u) Y
  5.             //发送消息给服务器: `, E0 G8 s" K/ |$ E
  6.         socket.send('Hello Server! im websockt');
    6 N& @# D4 [# C: y2 z) w7 x
  7.     });  }0 e$ x& {0 k
  8.     // Listen for messages
    6 Q# j( c. Q) b3 L' L( O4 x
  9.     socket.addEventListener('message', function (event) {
    2 b. m- Z, u/ x' g1 r
  10.             //接收服务器返回信息
    2 d( g( X+ D0 L# e; V
  11.         console.log('Message from server ', event.data);) E. A2 N5 A0 U# b. T
  12.     });- Q& F+ X3 [! ?) k! M
  13.   J3 L2 r# f5 r
复制代码
伪直播主播页面5 E! {2 o+ X; {2 V' `3 ]" \

html

  1. <body>: F8 Z+ e' G9 D/ [" B
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>% q; |  w1 z9 _* [/ M  u0 a
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">: K0 L$ }  ?* {% p
  4.         画布
    0 p4 k1 W. m6 Y& y3 V+ c6 U
  5.     </canvas>
    - K& c8 m. U$ d3 w+ f
  6.     <img src="" id="videoImage" width="350" height="700">
    0 u7 s, h2 f5 `+ S
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>( C" S% v% q/ W5 G/ j+ \
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>6 R5 V% `8 t* ^
  9. </body>/ b9 B+ B9 ]7 V2 v3 U; v7 e
复制代码

javascript

  1.     var v = document.getElementById("myVideo");( i/ @. f6 k/ f0 X7 r# K. W8 X
  2.     var c = document.getElementById("myCanvas");; K+ J, P: Z8 y3 k: o% e
  3.     // var c = document.createElement("canvas");
    $ a7 I- s; \: N6 m4 o6 a3 i: z
  4.     var img = document.getElementById("videoImage");
    * ^0 h' ?" ]  M4 p3 N& X
  5.     ctx = c.getContext('2d');4 X4 l4 \( A7 }/ Z9 @+ z; U) s
  6.     var dataUrl;: n3 G! A/ y. s$ {# }& C
  7.     const socket = new WebSocket('ws://xxxx.com:9502');9 }! I+ I; _/ @1 Q5 T
  8.     //Connection opened2 _5 L8 l8 q% x
  9.     socket.addEventListener('open', function (event) {
    . I4 P0 \6 {: j+ {' t( w9 d! _  N
  10.         // socket.send('Hello Server! im websockt');
    5 x* ^$ B1 O* E. W
  11.     });
    * q" ]" h2 y. t# q' \) T% K
  12.     // Listen for messages
    - ^: s$ V8 H$ x& O
  13.     socket.addEventListener('message', function (event) {
    $ v% g! m3 a$ k9 A, ~
  14.         console.log('Message from server ', event.data);: t- W) C" J2 G. j% i: ~
  15.         img.src = event.data;  K: h7 V' }, y+ X. L2 y9 S. h
  16.     });. x# t) X3 g; l* Z/ o+ R9 ?

  17. - D0 e+ R5 U- d8 p  s: M
  18.     function playVideo() {) t7 z+ H5 F0 o% t, E7 U6 u
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    # E, u4 z" c2 @& E: B
  20.         dataUrl = c.toDataURL("image/png");
    ' f) ]. _- x: ^4 s, P2 {( [0 [
  21.         // img.src = dataUrl;' E6 A8 K! N. M1 r) x
  22.         socket.send(dataUrl);
    & y, G1 A) d. c' X' G1 F
  23.     }
    ( {' X  L, |  o" R4 R
  24.     var tick;
    ( C& |2 q4 ~# m  q
  25.     function aphla() {
    ) g9 b" d' K5 y# s
  26.         tick = setInterval(function () {
    & I, B- v9 q' w$ P* X% w% H# B
  27.             playVideo();
    $ v" [3 Q; Y1 w' v, r! d9 j
  28.         }, 1);, {1 @2 v2 W- T/ N$ A* J0 a, U4 |
  29.     }
    ) y- d% B+ q, H9 {$ e: A. Z! H
  30.     function vdStop() {7 T5 t8 P8 o7 e# B# g
  31.         clearInterval(tick);7 F* i7 {; |, Z4 l9 B' K
  32.     }
    . {3 v/ _6 P4 x
复制代码
用户页面* u7 z) d! |6 {0 i4 S, E; x2 @

html

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

javascript

  1. var img = document.getElementById("liveImg");
    ; x0 }5 b' {5 `$ C0 X/ R5 u+ b
  2.     const socket = new WebSocket("ws://lm.com:9502");
    $ P& I# }0 L/ Y: ?( e. B1 b
  3.     //
    : I9 w! j9 N( k! }
  4.     socket.addEventListener('open',function(){" I! R& r0 w  f) U9 q- K4 Z; e
  5.      socket.send('Hello Server! Im live.html');
    9 g! o. V# v) k3 Q
  6.     });* h+ I- I0 \8 V  p
  7.      // Listen for messages( P: w4 ]( C4 R2 I# `# a7 N
  8.     socket.addEventListener('message', function (event) {/ ~; ]$ R. l/ O- S
  9.         //图片地址; O0 M3 w. P1 u* \6 S
  10.         img.src = event.data;1 `- X+ P+ g: A6 S
  11.     });
    % h' m9 V; v0 E  E. {
复制代码

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

, |& f9 S* t. [4 R* [
$ @8 o( ~* M" H/ y' z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 12:59 , Processed in 0.121150 second(s), 19 queries .

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