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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  8 ~# i8 n6 M! k7 \$ p9 K6 a
  2. //创建socket服务
    / X# M  Y6 C  I% R  n+ Y1 L( [* Y
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
      d8 f( k6 |6 y; H: V/ r  g2 P5 q4 l
  4. //监听WebSocket连接打开事件( T: m0 N( Q+ I0 ^5 h, F& f" p
  5. $ws->on('open', function ($ws, $request) {3 d/ a# g. l& a" @( q
  6.      var_dump($request->fd, $request->get, $request->server);
    2 a2 k) l9 `/ a* j  y( z* L; P0 @
  7.      $ws->push($request->fd, "hello, welcome\n");4 N# I' H2 t3 m! }6 w, y# Y
  8. });
    ' P$ ^# M9 E/ Q: ?8 e6 P
  9. , p/ R) O% O% V8 J2 s9 z0 I
  10. //监听WebSocket消息事件
    3 |; @& D- v& w1 y
  11. $ws->on('message', function ($ws, $frame) {9 K' Y& y& B" D, U
  12.     //推送消息给所有用户
    ; n  p& O: ^8 A  B& N8 A
  13.     foreach($ws->connections as $fd){) P; l; m) a1 E7 D8 E! P# {
  14.         $ws->push($fd, $frame->data);- s3 C, G6 L7 @* ^' k" H' d
  15.     }
    $ |) p$ ^3 g" q, M6 n
  16. });
    8 k. j" `- I( J8 s6 _; }9 k

  17. 2 j6 R- ~4 p$ Y0 r6 Y3 B2 T
  18. //监听WebSocket连接关闭事件
    ) @7 J- R, q  C, a! q
  19. $ws->on('close', function ($ws, $fd) {
    ; U$ J+ m% m  T
  20.     echo "client-{$fd} is closed\n";
    " c; }9 L, F; s7 m. O
  21. });- C' k* R/ Z4 A0 k8 G* s
  22. //启动服务, V6 w) e8 q! Y3 \
  23. $ws->start();( `9 E+ F2 ?. D; v" t5 C0 o
  24. . \8 @: _4 W1 f' a* w1 p7 L
复制代码
9 B/ C! \5 u* P
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
1 x: y+ k7 ]: F8 z% h7 t. e0 L

代码如下

  1. //连接服务器
    ' J7 q' t- Z  Y. X
  2.     const socket = new WebSocket('ws://lm.com:9502');1 R0 `& F7 Q" s
  3.     //Connection opened, `* a# Q1 T2 Q4 S4 }
  4.     socket.addEventListener('open', function (event) {1 m/ [3 Q& J, V( j9 G
  5.             //发送消息给服务器. l- V; \6 z7 ?% Z' M) ]4 @
  6.         socket.send('Hello Server! im websockt');- T' O% A& r& \/ ^7 K3 \/ x  E2 }
  7.     });( t, J9 h& D* @2 Y
  8.     // Listen for messages
    ) Q3 i4 f( \! K  p2 w1 r( L
  9.     socket.addEventListener('message', function (event) {
    0 s" U( J' O& x
  10.             //接收服务器返回信息
    , @+ o2 {( q6 z5 @  |; n% W
  11.         console.log('Message from server ', event.data);
    * U+ d4 n( ^5 B% ?) }0 E* ]$ ]
  12.     });
    ! O8 r4 @2 W7 x  ?
  13. , k: S' {% d& L1 {
复制代码
伪直播主播页面: D2 Z5 g; ^! d  `! W/ r

html

  1. <body>
    + s+ C/ ~$ h9 ~' j& G
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>% f# V! F& [6 Z' ^
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">, f* j" ^5 y2 Q# r
  4.         画布
    + `5 V* ?* g' J2 @7 m
  5.     </canvas>
    6 ^. J1 q9 ?! h7 k) ~- |
  6.     <img src="" id="videoImage" width="350" height="700">
    5 m' ?: N7 B9 {. j* H" h6 r3 y
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    7 U2 h5 ?$ R/ D+ y9 e
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    6 U$ t. T3 K! M5 T6 d1 e1 ]
  9. </body>4 A# u6 d% ~! L$ U; ?- a
复制代码

javascript

  1.     var v = document.getElementById("myVideo");5 t! m3 i: s# j; W5 l: ~( t
  2.     var c = document.getElementById("myCanvas");
      o; c; l- t6 H5 r9 y! h: n" O
  3.     // var c = document.createElement("canvas");
    5 N; P: d# N; L5 k
  4.     var img = document.getElementById("videoImage");- R! o! L3 C5 s6 R# Y/ i/ X" T# J
  5.     ctx = c.getContext('2d');
    # C: E& A* a; a5 Z( Y
  6.     var dataUrl;
    * V, {$ o1 ~& t. j9 r3 T' I3 r7 o
  7.     const socket = new WebSocket('ws://xxxx.com:9502');" ^" f; {6 ^( |7 ^4 \5 {
  8.     //Connection opened% p; F/ a) m# x* f6 a
  9.     socket.addEventListener('open', function (event) {
    + c% m* y5 B; l+ k1 |4 Y% a
  10.         // socket.send('Hello Server! im websockt');9 s5 ?' o3 A6 ]
  11.     });. \$ d# X. V1 M" [( ~# R* u' h/ t- m
  12.     // Listen for messages, I$ G8 M4 X, c1 G4 U9 ~- t8 ~& }* \
  13.     socket.addEventListener('message', function (event) {" |$ Y  m( t4 i3 a. m' ~1 }
  14.         console.log('Message from server ', event.data);: |8 j, C/ Q, D- ?4 f8 X
  15.         img.src = event.data;
      ]& r1 p- Q- e0 ]; x4 q, c3 J
  16.     });
    8 u$ v" v: ?. H: `$ ~! e
  17.   y4 r8 g. n9 F* u6 D
  18.     function playVideo() {# [) t$ P1 e: P7 l8 \7 M% I" P. Q
  19.         ctx.drawImage(v, 0, 0, 350, 700);' F; `1 K6 E& Q# X
  20.         dataUrl = c.toDataURL("image/png");
    & e$ X: _% j$ x9 A4 l, Q( G, ]
  21.         // img.src = dataUrl;/ s+ G4 r/ m' d0 }& ?
  22.         socket.send(dataUrl);7 k/ t( Y! A; `
  23.     }
    2 ?& y- H* r7 L) j
  24.     var tick;8 ]: ?$ p$ L5 W) p% {  p
  25.     function aphla() {! U' W% x7 Q8 r3 @
  26.         tick = setInterval(function () {
    ( t  _6 `  q7 U8 H) a
  27.             playVideo();6 J4 }7 k3 Y$ N& r8 L" k6 B0 Y
  28.         }, 1);
    1 U8 d4 U! I+ f* B2 w' q
  29.     }
    " O4 `, B) l2 W0 S
  30.     function vdStop() {
    4 w7 c. Y% y* E) O
  31.         clearInterval(tick);0 ~5 B$ M" r" \# P1 \& e
  32.     }
    2 r5 N: U& M) U
复制代码
用户页面7 i8 r, `* F8 c$ Z7 x- R# M( V

html

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

javascript

  1. var img = document.getElementById("liveImg");' @" s! A/ i( S
  2.     const socket = new WebSocket("ws://lm.com:9502");
    $ @9 K; P: L. c5 L; ~
  3.     //: {6 A9 C+ l* W  P8 Q; J
  4.     socket.addEventListener('open',function(){* L7 e( Z% Y' h) k. x
  5.      socket.send('Hello Server! Im live.html');
    : L! e( ?' t4 l: Q& f/ U! S4 ~
  6.     });5 @: z7 K9 n0 N# L; i3 i
  7.      // Listen for messages
    3 N7 r4 u0 a- p# E0 z: X
  8.     socket.addEventListener('message', function (event) {
    6 Y1 ^6 M$ w6 o5 z) y& d  r$ \
  9.         //图片地址
    . Z( W1 Z. {- f/ m8 W3 g! H0 G
  10.         img.src = event.data;0 p: |+ n. }9 {! I, p
  11.     });- E- }" N: V7 [: f/ M
复制代码

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

& U5 u/ F: _+ v

) \" L: p% p. J. w- z) ?4 L8 s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 16:13 , Processed in 0.057142 second(s), 19 queries .

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