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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    0 b! p: m( ]8 |, N1 L
  2. //创建socket服务
    4 E9 x4 |9 L  u0 F
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    - o- a9 ]% M# u- N1 X
  4. //监听WebSocket连接打开事件
    ; x7 v- |* q- F
  5. $ws->on('open', function ($ws, $request) {& r8 \/ H' t3 f& P% C& C
  6.      var_dump($request->fd, $request->get, $request->server);) v4 F8 J) @% F1 v+ J! k% u3 R8 I1 D
  7.      $ws->push($request->fd, "hello, welcome\n");7 r) H- u1 ?7 _( H& L- s& a3 C
  8. });
    2 F4 c: W: m+ Z3 S1 A3 R

  9. / U* x' m: j6 ]: {: M
  10. //监听WebSocket消息事件
    % Q( L/ e, s# e$ O! i
  11. $ws->on('message', function ($ws, $frame) {
    - F2 d0 s  B# u
  12.     //推送消息给所有用户
    # m5 g, `1 j. G# b7 Y, X
  13.     foreach($ws->connections as $fd){, K) b. c: T! K
  14.         $ws->push($fd, $frame->data);7 o" g& Z$ s* a! {) Y
  15.     }
    # c6 l: \! q; n- w- v
  16. });
    & f/ m; S9 u" ^( ~$ u
  17. $ G$ P9 z2 \5 x) N
  18. //监听WebSocket连接关闭事件# g+ f3 T( Z/ ^, ]& K! M8 W
  19. $ws->on('close', function ($ws, $fd) {7 P: z8 d. \6 u
  20.     echo "client-{$fd} is closed\n";0 m4 I" R% `7 {$ w$ r! O
  21. });6 F* J) ~8 o; W0 O! y
  22. //启动服务
    ) R5 K& O% a5 l/ q9 x
  23. $ws->start();/ A* @/ l1 t  J* U! x( `

  24. 9 s% N. N# o, F) m- C2 f2 Z' t$ b
复制代码
% X0 Z) b: `, V! \) j2 d
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
; R! j8 L" Y# Q; H& d* I! @  D

代码如下

  1. //连接服务器0 b" ?& i1 W  `6 }; E1 q  B4 t
  2.     const socket = new WebSocket('ws://lm.com:9502');0 y2 |+ P' a4 T9 O: h9 ~
  3.     //Connection opened
    3 M6 \. I7 J5 c% [  ]
  4.     socket.addEventListener('open', function (event) {
    ' N5 E3 B1 ^! k2 B& l$ R7 `( {5 D
  5.             //发送消息给服务器% b" |! `7 C+ c
  6.         socket.send('Hello Server! im websockt');
    $ U# Y6 N: I  {3 D% R. c! O9 n; A
  7.     });% [3 d! q1 E5 m
  8.     // Listen for messages
    . z. _9 {3 x4 P  S+ _
  9.     socket.addEventListener('message', function (event) {
    4 B- b3 k) J# }8 M/ I/ k
  10.             //接收服务器返回信息8 B" O  Y% E; D# A4 d& F
  11.         console.log('Message from server ', event.data);4 O' Q- i$ |) v3 P% j0 F  G0 z6 ]
  12.     });
      M/ x3 ]" n) n6 Z* b: V0 c/ a

  13. " Y6 u: l* z( M' S* I2 j
复制代码
伪直播主播页面3 A9 d+ }6 u" k

html

  1. <body>& ?1 t' |/ k0 X4 j7 m
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    ) q+ l9 B% v) p$ w* b9 y! i" K
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">% T/ i: n6 b, c4 v
  4.         画布6 \+ P' \/ O% z. `' x' r
  5.     </canvas>
    " {5 Q7 ^. O0 S7 F
  6.     <img src="" id="videoImage" width="350" height="700">
    9 l8 g2 H) b/ ]# h
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>( O& o4 f' r! B3 m% H( n  ]& u
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    . [' Y1 i4 f! k4 P
  9. </body>! `$ {0 ]3 Y0 l
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    ( B* A' @1 p8 O8 h. {
  2.     var c = document.getElementById("myCanvas");
    1 s" _3 N% t- t* z6 G+ B) `
  3.     // var c = document.createElement("canvas");" t& N( j$ r1 h
  4.     var img = document.getElementById("videoImage");
    ( o$ X0 z# |- N% x4 Y, n  A
  5.     ctx = c.getContext('2d');- `1 N% @' W8 B! u% o) o
  6.     var dataUrl;
    % r0 l" w; j; V; _, W  M
  7.     const socket = new WebSocket('ws://xxxx.com:9502');0 G& R# c" z% W2 T! k  |+ i3 f
  8.     //Connection opened8 E* N4 n, P3 g
  9.     socket.addEventListener('open', function (event) {
    0 w, w  J2 \- D& `1 q0 Y, R& O3 P
  10.         // socket.send('Hello Server! im websockt');
    ; _; d2 z. Q. p" x
  11.     });# t  O8 N* O! f4 d
  12.     // Listen for messages4 ^% B) ?$ b* m4 ~, I! d
  13.     socket.addEventListener('message', function (event) {
    ! `9 C$ Z0 C* R; C3 P
  14.         console.log('Message from server ', event.data);) y. K+ q" T; Z- z* Y% S
  15.         img.src = event.data;
    , h8 g. X$ `8 G# W! p  v! y
  16.     });
    7 l5 y5 u) F( i# f7 J" \/ ?

  17. - c1 b1 g( ^' X( j7 p# t& c
  18.     function playVideo() {' ^/ b  d2 D! Z# N9 e
  19.         ctx.drawImage(v, 0, 0, 350, 700);' |9 z6 A2 v2 N! k  \, ?% X
  20.         dataUrl = c.toDataURL("image/png");2 q$ s$ R, m; h. A2 c
  21.         // img.src = dataUrl;
    7 ]# C" f3 a) b" a
  22.         socket.send(dataUrl);. N* R( v) q3 x. a9 u8 a/ u4 T
  23.     }' b$ a1 F' r  X- j7 i$ K  ?
  24.     var tick;
      O: ]. p4 V: }$ {+ Q, F5 i
  25.     function aphla() {$ U' ^! U( F9 I
  26.         tick = setInterval(function () {
    6 g/ q; M8 z: ]  m: u2 q( W( w
  27.             playVideo();+ p2 X$ r, [. o+ r
  28.         }, 1);
    / |3 s* O; R9 {6 H/ k, Z3 m% v
  29.     }
    - K2 ?4 P  F! y
  30.     function vdStop() {
    . ~& b( p& j6 u$ H
  31.         clearInterval(tick);7 Y/ R: c  d' v) n1 Q1 D& Z
  32.     }" E4 s5 z+ y1 _
复制代码
用户页面" L2 K6 \/ E5 \# F8 f3 T, _8 W% ^

html

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

javascript

  1. var img = document.getElementById("liveImg");; f$ U+ z( J( C8 p; c
  2.     const socket = new WebSocket("ws://lm.com:9502");
    - a5 J2 p0 V0 B7 P
  3.     //- _& J$ z% O2 W) R6 d0 h, W
  4.     socket.addEventListener('open',function(){
    * C  x1 F, S) u
  5.      socket.send('Hello Server! Im live.html');. E- L4 B: X$ c' v. R
  6.     });
    : Q- U( D7 x$ }8 {; l  d2 w& z
  7.      // Listen for messages
    # C. R  `. m! }! c! j
  8.     socket.addEventListener('message', function (event) {
    6 u' H8 W/ A8 H, _' f# d$ Q$ I6 C7 l
  9.         //图片地址; O9 @$ I4 s6 w0 ^2 {" ?' Q( C
  10.         img.src = event.data;
    5 n3 R) a2 ]2 m8 L3 ]
  11.     });
    + M0 C6 ~4 ~! V6 C
复制代码

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

& Z* P, n: c! F( `$ ^# ]) r0 {2 h7 S

8 I2 ]  A! q- _4 J
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2025-2-5 18:48 , Processed in 0.120697 second(s), 21 queries .

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