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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  7 \  R) f- [! b/ {" a
  2. //创建socket服务! `: O  [5 E2 m/ @: a" l' a5 G
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);5 |8 \' Z+ c' @6 H  n+ Y0 J. a8 g
  4. //监听WebSocket连接打开事件7 u+ D9 Z8 V$ w! M9 J/ i: y; ~
  5. $ws->on('open', function ($ws, $request) {
    7 t7 j, R/ ~0 F" T1 A  v
  6.      var_dump($request->fd, $request->get, $request->server);+ ]5 @: l, l9 z+ C6 e
  7.      $ws->push($request->fd, "hello, welcome\n");
    . Z# T) L5 u' y" O7 P1 h) k4 a
  8. });- Q7 {% g- E. x
  9. % X7 f4 [. z7 @: U8 Z  U
  10. //监听WebSocket消息事件; a6 m0 N, `( ~
  11. $ws->on('message', function ($ws, $frame) {. L, i9 I0 n) j4 b. Y0 o
  12.     //推送消息给所有用户  a7 f$ h* ~) u, j. y, c
  13.     foreach($ws->connections as $fd){7 b" d# G, Y  W5 X' f. n: d
  14.         $ws->push($fd, $frame->data);. b/ ^5 y2 G$ v( P! u1 W  o- e
  15.     }
    * u; Z/ U- c, }. I% r
  16. });
    # {% F4 F) r0 r1 }
  17. ( s8 `" b! [! ?/ U5 c* j
  18. //监听WebSocket连接关闭事件
    . F% q6 `1 u+ \+ I$ \% s9 m6 u( r
  19. $ws->on('close', function ($ws, $fd) {5 b6 U0 p: \, {
  20.     echo "client-{$fd} is closed\n";2 X9 {) R: W) m9 u, o& C
  21. });! M8 p  J/ w0 L
  22. //启动服务
    + d. Y0 N& J% S
  23. $ws->start();2 h  C: |$ m& m6 I$ [$ |) C: U1 Y2 O
  24. + {% Y6 L) @, m; H: o0 ]' m, I
复制代码

; Y5 j2 T$ `& ZWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
+ p; X- Z! a' |- H9 }- c

代码如下

  1. //连接服务器
    9 z9 b+ B9 z  R% b( Y2 N, D
  2.     const socket = new WebSocket('ws://lm.com:9502');+ k5 ?# Q: M1 m, P1 ^; `( @
  3.     //Connection opened0 H3 V2 _- V) C5 ^% z; w6 v9 H( U; I
  4.     socket.addEventListener('open', function (event) {
    % D( h5 `, D2 |
  5.             //发送消息给服务器+ z7 O3 N! ^% D& z
  6.         socket.send('Hello Server! im websockt');4 m/ C5 H2 g8 \3 l& F$ P( Z* ^* }
  7.     });, a9 y4 V) A% u' y2 F
  8.     // Listen for messages2 k2 O0 D, j7 n: [6 _/ p# o
  9.     socket.addEventListener('message', function (event) {
    # y! I6 a! h) T
  10.             //接收服务器返回信息, v1 ^2 N: c2 U& y
  11.         console.log('Message from server ', event.data);$ B  B# P. D* ~3 \( V$ Q4 o" @! ~% K: f
  12.     });
    1 W9 |( c8 Y) @$ \" [3 g

  13. - R$ M$ o7 x7 T
复制代码
伪直播主播页面
8 M+ D4 P/ r! b6 h$ z% q

html

  1. <body>
    : w% h. G5 W* t! ?
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>- N5 N, Y# k$ v) y5 A7 j
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">/ m1 m7 m8 q& L0 s( P
  4.         画布; R8 `$ m) j- O4 l% g
  5.     </canvas>
    $ {4 u$ }# L) j( w- p& o
  6.     <img src="" id="videoImage" width="350" height="700">8 L# l) ~: x1 ^% z* Y
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    " q; q1 ~+ b# y! l1 d! g5 t
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    + v& T! ?! r' J8 r$ y5 ]
  9. </body>
    ) \( p% a7 ~- m1 t
复制代码

javascript

  1.     var v = document.getElementById("myVideo");8 y4 ?1 i- P! a/ B( }
  2.     var c = document.getElementById("myCanvas");
    - Z5 H5 t2 z3 ]8 e+ S/ j% P. |" R* j
  3.     // var c = document.createElement("canvas");) ?+ u$ L6 v8 x! Y- |
  4.     var img = document.getElementById("videoImage");9 f( g0 J" [( M' C! Y' f6 Y
  5.     ctx = c.getContext('2d');0 F: l9 X7 a% M9 L9 _
  6.     var dataUrl;
    6 z8 h" k& q# l! y7 H
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    2 X* o; C: i+ @/ T2 h+ X8 n
  8.     //Connection opened* W7 G2 @, f- [! u4 g* i- k
  9.     socket.addEventListener('open', function (event) {# P$ d: J3 W' k8 x* _
  10.         // socket.send('Hello Server! im websockt');
    * Q( G- h% X! i( ~5 T( m+ k3 s
  11.     });
    " B* y, k- B% Z; w2 q& R8 N
  12.     // Listen for messages
    ; Z0 J2 ~' x* b6 S7 }3 E
  13.     socket.addEventListener('message', function (event) {2 D1 a6 M7 Y8 N+ P
  14.         console.log('Message from server ', event.data);9 u1 w7 ]# [# \3 N( x% }2 N
  15.         img.src = event.data;
    4 x/ e8 [8 ^6 O2 B1 f
  16.     });9 U7 L; o5 c! r0 W0 r) w' d* `+ Q1 ]

  17. , g4 `* S" S0 P& t
  18.     function playVideo() {# k! @, p7 B# i( R% C1 `( w
  19.         ctx.drawImage(v, 0, 0, 350, 700);. R0 Y8 T" L2 l2 E  f& u7 Q9 B
  20.         dataUrl = c.toDataURL("image/png");4 [3 t' w8 G. o2 c/ Q: l
  21.         // img.src = dataUrl;
    # b: V! T. d# d( ?9 i
  22.         socket.send(dataUrl);7 O% I8 a# `! @- }2 o. p% }
  23.     }( G, R, H0 U7 l( v" N
  24.     var tick;
    . S# Y3 P7 d* U8 C. @6 \" K$ ?
  25.     function aphla() {
    7 j; t8 ~9 S! k: T5 \2 R9 ^" [0 R8 a
  26.         tick = setInterval(function () {
    2 f: t7 d5 P1 u% V% T! v
  27.             playVideo();% d% `: A4 A- l: P% w) @( `4 e+ B
  28.         }, 1);& ?  R/ t! N, a" Y. K
  29.     }/ {) C( r, `9 {# t
  30.     function vdStop() {, {3 M& o! ?) q/ ~; ?7 Z
  31.         clearInterval(tick);; q0 D# S- C/ y2 T5 ^
  32.     }
      T1 u2 E# ?8 E5 h  n
复制代码
用户页面% q) G# ?5 J1 `& t% w9 F; g. c2 V1 k# T3 U

html

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

javascript

  1. var img = document.getElementById("liveImg");5 G* y/ Z% L: B) x0 }* E; D
  2.     const socket = new WebSocket("ws://lm.com:9502");
    8 L. R/ g6 i- z8 z+ N
  3.     //
    % t$ o: I- }" U; i
  4.     socket.addEventListener('open',function(){: K% m) ]7 R, v+ v7 ]  S
  5.      socket.send('Hello Server! Im live.html');
    . \6 R+ k7 h9 V9 i( Q) I  C0 O% Z
  6.     });* g% F  l# E# D% k! r$ S% J
  7.      // Listen for messages+ h+ C* z. R, x
  8.     socket.addEventListener('message', function (event) {
    + {. `2 \3 N% I  o; w" i5 c
  9.         //图片地址
    / M1 N/ ]0 ^/ p" a$ {( n% D$ I/ K
  10.         img.src = event.data;
    ; |2 p- ?+ T. U
  11.     });
    ) e: {- F/ v9 T' ~6 S
复制代码

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


5 @6 l; R' Y$ o( h& @3 z7 q$ ?1 g+ U& B1 a7 A6 J3 B
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-17 12:01 , Processed in 0.108351 second(s), 19 queries .

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