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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  / `0 f! U6 m* Z' E5 S
  2. //创建socket服务
    ) }+ ~) `& z& H* r1 ]8 T
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);7 a( h2 n0 B1 t6 y' X
  4. //监听WebSocket连接打开事件
    ! @, |) i$ J0 B& H9 |% z
  5. $ws->on('open', function ($ws, $request) {
    2 @: ~. @# s( @5 ~. ^7 q% E4 }- @
  6.      var_dump($request->fd, $request->get, $request->server);
    / h% G3 Y" X% b; M4 m
  7.      $ws->push($request->fd, "hello, welcome\n");5 |/ ^& {4 u+ Z% W( T. m
  8. });
    4 U6 S7 P! F* G7 J, l$ E) L
  9. # D- r3 _( U& u
  10. //监听WebSocket消息事件7 j: y6 ^9 ~, |( J
  11. $ws->on('message', function ($ws, $frame) {8 D' V2 v% v4 _& Z# n+ c
  12.     //推送消息给所有用户
    ! L1 i+ o4 `6 y# @- _# U" B+ T
  13.     foreach($ws->connections as $fd){/ s: O4 k" p. J7 ]7 k
  14.         $ws->push($fd, $frame->data);
    * k7 @% `9 {) O0 r) F2 B8 l
  15.     }
    # \& \9 x* ]; t+ Y5 W! Z
  16. });& c& s9 N; Z8 Y: M( o% v
  17. , E& t& h$ U& P' ^0 S7 M# y% l
  18. //监听WebSocket连接关闭事件- {7 g! h6 g2 _+ x! N7 O7 D' S
  19. $ws->on('close', function ($ws, $fd) {2 d% C+ y7 Q1 y
  20.     echo "client-{$fd} is closed\n";
    ) ^$ K" d) V. H2 U( \* s- Y* o5 c' T
  21. });6 C' q% m* L6 n( ^" U; c
  22. //启动服务" A+ o8 s1 K/ M& W
  23. $ws->start();
    2 V9 E6 R+ M# u' p5 f& |
  24. 7 v1 E1 ~8 p7 U& v- x" A) D2 m/ y
复制代码

& u+ b2 I9 B% p! _) wWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端& W1 T6 k) @% `, y  I  g

代码如下

  1. //连接服务器3 f* o: [4 ~. S4 U0 d; R
  2.     const socket = new WebSocket('ws://lm.com:9502');7 e5 I) \4 c/ \4 U+ i% u+ Y
  3.     //Connection opened6 V+ P2 [3 v+ N
  4.     socket.addEventListener('open', function (event) {7 `0 e, [4 a5 H% Y6 R. b
  5.             //发送消息给服务器6 l. C! O( P2 N
  6.         socket.send('Hello Server! im websockt');" j0 Z- d3 W3 C6 `+ e3 U
  7.     });& d  p4 C) @6 {# q4 f
  8.     // Listen for messages1 i6 b3 w9 _" g, f
  9.     socket.addEventListener('message', function (event) {& M$ ?; o4 R5 ]8 w3 d* q6 G
  10.             //接收服务器返回信息
    ( `% s0 G3 X  F. [/ L
  11.         console.log('Message from server ', event.data);
    , H+ k; `. N$ u+ _/ _1 [5 Y! g
  12.     });% @" C* j, g- w: i- Q7 v

  13. , |" T- L) D1 H" g6 Q3 O
复制代码
伪直播主播页面
5 U* G6 ]- @0 v$ j

html

  1. <body>
    . M; Q# F* ~! a; `4 u
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>* U/ m: ]4 n+ @$ y9 p6 [8 S( V1 Z
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    0 Y; H6 ]+ U: V( K: z9 L# X
  4.         画布
    3 ~- K' j$ q6 I7 N
  5.     </canvas>9 d$ z6 a9 L; _
  6.     <img src="" id="videoImage" width="350" height="700">
    / \' G% h3 j- r9 w! E" Y
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    ( B9 \! b  z8 @9 g* Q
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>5 F1 P2 {+ Z$ f, Q! _
  9. </body>
    6 f' I* I% E' J% F/ c
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    8 @! a+ ^: n& P
  2.     var c = document.getElementById("myCanvas");
    $ o1 ]2 |2 m' Q9 l) ~
  3.     // var c = document.createElement("canvas");
    , o1 e) q! s/ M. ~0 H
  4.     var img = document.getElementById("videoImage");1 b: B6 W2 B+ Z5 F8 o: d- C) u
  5.     ctx = c.getContext('2d');
    & `- u, r/ d( U3 y9 G( y( N
  6.     var dataUrl;
    . B# V# P7 r+ L8 G1 ^2 f
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
      L: t% E$ k4 Y
  8.     //Connection opened
    9 c/ b" B( P; t5 j& ]# {: r
  9.     socket.addEventListener('open', function (event) {2 G! @" _( W3 @/ s9 R4 O; d% E+ N
  10.         // socket.send('Hello Server! im websockt');6 B5 ]8 C. L( K6 \, ]
  11.     });8 P4 F/ A6 Q8 U7 N' d; v
  12.     // Listen for messages( ^  ~  M9 o' ~. J% {! n7 n& U; ~
  13.     socket.addEventListener('message', function (event) {: k- c0 [% \! F+ \# @) u2 Z: w
  14.         console.log('Message from server ', event.data);. A+ j8 i3 i' @0 x
  15.         img.src = event.data;8 C8 ?- k. _% I1 h
  16.     });
    6 H6 N' V9 D5 Y! v2 L6 d
  17. / ^- d# [( e) E1 U9 t: M  [
  18.     function playVideo() {& J( z. [5 H0 C1 j+ v  H# g
  19.         ctx.drawImage(v, 0, 0, 350, 700);. D5 U, L9 M9 Q& i. O: E
  20.         dataUrl = c.toDataURL("image/png");
    ( g( B! j* q; x4 P3 }
  21.         // img.src = dataUrl;- X/ F+ ^& |0 X" ^
  22.         socket.send(dataUrl);
    * `7 L( ?6 j/ x. K9 M, h* I; S! G
  23.     }5 U+ y. q4 ]- [2 y4 ]6 A
  24.     var tick;* D* T6 u1 A& Z2 ?) M: w
  25.     function aphla() {
    , y1 i2 \. }2 S
  26.         tick = setInterval(function () {! g: B# I+ Z( X; c" Z2 w0 \
  27.             playVideo();5 S" [/ w3 {/ ^: d& |! I
  28.         }, 1);
    % l) T' k8 p: U4 I( e
  29.     }
    / J# P9 r. L( I2 G
  30.     function vdStop() {* e+ X8 {$ P8 k! L7 r$ ?
  31.         clearInterval(tick);6 `# l+ X9 M: \& z( N$ r
  32.     }7 ]& Q% c5 E) P0 ^$ b" G
复制代码
用户页面( b' I" N5 r% k+ c: @1 q

html

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

javascript

  1. var img = document.getElementById("liveImg");# b6 ]5 `4 o, D2 E  |
  2.     const socket = new WebSocket("ws://lm.com:9502");
    # I2 V! s6 h2 S3 Y: X
  3.     //) h8 F; Q3 l0 _1 \, A5 D" w6 o/ c
  4.     socket.addEventListener('open',function(){
    6 m0 U' x- I0 C/ ~6 a! v' \
  5.      socket.send('Hello Server! Im live.html');. V1 r4 Q( V" z  H$ L: g% r' w0 n
  6.     });% [; E8 J! _# v1 j+ k1 ^
  7.      // Listen for messages1 W/ N6 Q0 s8 A
  8.     socket.addEventListener('message', function (event) {/ ^* V5 k: K. w
  9.         //图片地址% s0 a" ^& S7 Y! P2 \
  10.         img.src = event.data;
    4 r. r/ F0 z$ _9 ~1 k% E4 j  M4 m9 Y
  11.     });
    * N4 S7 G# C0 f& G9 c5 a, I
复制代码

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


" I# I" N% `2 ]% \7 @; d: A- g) {3 l7 C3 F7 t0 S. K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 11:23 , Processed in 0.105247 second(s), 20 queries .

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