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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  $ z/ }4 n) P9 \5 ]
  2. //创建socket服务
    . ~; n- Z7 d% n+ V: {/ H
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    * x/ U1 I  y0 h! g( f
  4. //监听WebSocket连接打开事件, u5 ^/ w" A& t* f/ u" E7 j3 L
  5. $ws->on('open', function ($ws, $request) {4 k6 e% j! L5 D9 J. n: z1 T! R
  6.      var_dump($request->fd, $request->get, $request->server);# J4 N7 w+ _& b# M9 x2 g' h
  7.      $ws->push($request->fd, "hello, welcome\n");
    . H) X; h+ C* Q1 G
  8. });
    , g4 e0 S2 q: s
  9. 0 \- X/ K) m# |; V2 b8 ~4 S
  10. //监听WebSocket消息事件, W, j% o# P% u
  11. $ws->on('message', function ($ws, $frame) {
    7 \' J- r8 P5 q. q$ p' E$ j, `
  12.     //推送消息给所有用户
    * E/ K  P$ v5 t' j# B
  13.     foreach($ws->connections as $fd){' Y( i. M8 b/ @$ V% T* l& a: L+ y
  14.         $ws->push($fd, $frame->data);
    7 [7 E5 l0 K( U8 f+ s: m
  15.     }
    # _. N* r5 c4 D6 O5 _# h6 `' y
  16. });
    " u5 F( ~1 g, U/ H

  17. ( k8 `4 f. f, E" m, @- ^( x
  18. //监听WebSocket连接关闭事件
    & _9 K- ~* H, l  P
  19. $ws->on('close', function ($ws, $fd) {+ K8 f" |% q; G+ Y1 v/ K1 |
  20.     echo "client-{$fd} is closed\n";
    ( E4 G- B2 @, A
  21. });
    6 a+ p" a$ }. E/ y" q) |# \+ D
  22. //启动服务
    0 w6 l8 x. P" r
  23. $ws->start();# u. n8 Z( F% j1 T8 a. ~
  24. 2 l- ]) v9 S: ^9 l$ e6 C  x
复制代码

" Q- P; m* I  Q: l- i; _) GWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端# g* N5 u7 d! o( I" [

代码如下

  1. //连接服务器
    ; `9 i1 v$ o4 _! X  n& q
  2.     const socket = new WebSocket('ws://lm.com:9502');
    ; ?! n( M6 C8 \
  3.     //Connection opened; R, L5 n: U, v7 }* ?
  4.     socket.addEventListener('open', function (event) {
    % B; Y1 j) X- c* C; H' |- H2 C4 }
  5.             //发送消息给服务器( F# o& q* Q1 S. q  M! m( }( V
  6.         socket.send('Hello Server! im websockt');. Z! F; g2 |7 t( k* d8 g) ~' I9 Z
  7.     });0 W- b+ I- {, Q% ~; Q
  8.     // Listen for messages& O2 r5 L: U- h3 \/ P7 m
  9.     socket.addEventListener('message', function (event) {. }& }5 q# j3 O7 L2 d
  10.             //接收服务器返回信息* N! }% ?; V1 W: e; B' _
  11.         console.log('Message from server ', event.data);
    3 m+ `$ R5 ^* l* D
  12.     });3 a  ?7 R4 w" H# ]+ A* o( Y0 h; L
  13. ( C: L. o8 M: ^' v- a6 h
复制代码
伪直播主播页面2 v3 k+ y; P1 @0 t2 w) k! Y8 ?+ G

html

  1. <body>
    ! J* y; W5 g6 n- u# p; x
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>: t. ?/ k0 {+ }3 q* N4 c1 O7 w& P$ p; R
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    5 `1 v, d. l- w) L: W& T# U
  4.         画布. \/ e+ f3 h) t  N# q
  5.     </canvas>
      J. u0 L/ W% J( W' Q6 L" y' N. R
  6.     <img src="" id="videoImage" width="350" height="700">
    ! ^$ a' X0 `( S
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    # q- C5 i" w3 P2 X& V
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    . G+ R: @( l2 N& L
  9. </body>
    ) }) T: ^; w" _9 o
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    ! \8 E9 L% h4 }5 P, y3 N  Q! B: A$ E
  2.     var c = document.getElementById("myCanvas");9 w$ a; L3 R9 T5 U( y- a# Y
  3.     // var c = document.createElement("canvas");5 Y7 S; o# @2 q+ V
  4.     var img = document.getElementById("videoImage");9 j! Y  R8 Z* j- c5 D+ P
  5.     ctx = c.getContext('2d');1 Y$ R6 S% M  k4 m' _
  6.     var dataUrl;) g" \3 a. l! [
  7.     const socket = new WebSocket('ws://xxxx.com:9502');' c! W4 c# X# {: E/ `9 j+ s
  8.     //Connection opened6 e+ V8 F3 m; o6 d) X- J! y# m( v2 f, r
  9.     socket.addEventListener('open', function (event) {( }6 |5 c  J1 v( I- q! J+ B1 n
  10.         // socket.send('Hello Server! im websockt');/ N- M' P5 r) H# _4 y; e) |
  11.     });
    7 A$ s5 r+ I( j& H
  12.     // Listen for messages* j5 S% M$ W$ y1 Z& G! w
  13.     socket.addEventListener('message', function (event) {$ [3 l9 u+ s( C- O
  14.         console.log('Message from server ', event.data);/ Q3 \1 ?, O0 S+ i1 y
  15.         img.src = event.data;* q7 b- h. s3 C, ^
  16.     });
    $ w7 {4 W( D) c* I! }

  17. 9 j( }! @$ J" U  R
  18.     function playVideo() {
    7 b$ D3 [) _' `
  19.         ctx.drawImage(v, 0, 0, 350, 700);+ U! i. L/ X  C& s0 y
  20.         dataUrl = c.toDataURL("image/png");
    . C' g: E! e; J
  21.         // img.src = dataUrl;. u' E9 Z' c! N  K8 C, m) q1 E
  22.         socket.send(dataUrl);9 A# O7 x  ~2 m; Y& @- `. r
  23.     }$ ]  d" f$ ~1 B6 k  q/ D* T% ^7 J
  24.     var tick;/ [' ~: l& V! J! W
  25.     function aphla() {
    1 o+ S+ Q# _* j; X* Q5 C
  26.         tick = setInterval(function () {! l2 S4 W; O! ]! [* y* \
  27.             playVideo();
    + D7 X# t4 I8 J3 \/ Y( ?
  28.         }, 1);
    0 B1 W( m. D% j2 Y% h
  29.     }
    + f4 u/ s$ u& ]1 \: x
  30.     function vdStop() {/ F$ r! _  ~" q7 Q- r: F; o4 L
  31.         clearInterval(tick);
    ( ]% T$ r: l/ J+ ?
  32.     }
    * X' C. s1 l/ X" n$ l
复制代码
用户页面9 x) u6 E5 K1 s# d

html

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

javascript

  1. var img = document.getElementById("liveImg");
    # j2 C! l, M! P" M- G" U2 Y
  2.     const socket = new WebSocket("ws://lm.com:9502");
    1 e* V' t* }/ h) L7 |9 e
  3.     //4 u$ p, n3 Z1 N* h! L
  4.     socket.addEventListener('open',function(){. c: q7 K# U0 g" W) e- [, I8 E
  5.      socket.send('Hello Server! Im live.html');
    5 t: e1 K% |+ ?  J* V& M+ G
  6.     });
    2 y/ x3 Q# h! v
  7.      // Listen for messages
    8 S, B, ^) D, v2 A
  8.     socket.addEventListener('message', function (event) {
    4 b# H8 ~3 d, z6 {
  9.         //图片地址/ M) B  P1 ~( b" M
  10.         img.src = event.data;4 H4 ^1 X) r' M/ [- x4 i
  11.     });
    - V- Q5 g; A$ N- |6 T: C" u
复制代码

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


/ t8 Y3 M; Q4 n( j) x
5 a1 H" A2 s9 _% Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-5 16:06 , Processed in 0.138551 second(s), 19 queries .

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