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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  4 a; X) O8 j2 T! Y8 V
  2. //创建socket服务
    3 `6 |+ N# r* ]3 ~# U$ o9 E8 e* Y
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);/ W$ H0 \, @0 ]. N$ ^9 t  U5 J
  4. //监听WebSocket连接打开事件
    " U/ O6 @9 D. ?1 X/ F
  5. $ws->on('open', function ($ws, $request) {' Q* W' Z2 q& K
  6.      var_dump($request->fd, $request->get, $request->server);$ L: \) g. {/ J  n" }
  7.      $ws->push($request->fd, "hello, welcome\n");# b* [+ W6 u/ U7 j" @
  8. });- |! a7 q; w" F) u

  9. 1 b! ^; U' A# e4 a% T% a6 Z+ ]' O
  10. //监听WebSocket消息事件: r: f, L0 e6 F5 S
  11. $ws->on('message', function ($ws, $frame) {) _3 b, O2 Y0 |( G
  12.     //推送消息给所有用户) Q0 r( X& E: K9 L9 C# O
  13.     foreach($ws->connections as $fd){
    : Y, ]& t- O1 v/ {1 R/ f1 k& k6 `
  14.         $ws->push($fd, $frame->data);- `& E" H6 f( {0 M6 I' Z$ {2 m
  15.     }- _8 a; x. n' N2 w8 d1 Q
  16. });4 X2 P( z7 B" Y/ E; _% a8 j
  17. - Q; ?4 z5 R+ a9 J
  18. //监听WebSocket连接关闭事件) Z+ R2 _/ G9 t- C; S; W8 v
  19. $ws->on('close', function ($ws, $fd) {9 ?9 s, V3 Q: _* N' s9 k% w4 |
  20.     echo "client-{$fd} is closed\n";8 {8 r6 \1 ]8 R0 v0 O, ?
  21. });& W8 h( @1 }0 ^% K
  22. //启动服务( P$ R0 R8 k7 i, a
  23. $ws->start();; y  W4 v6 h! x% N1 C/ _

  24. / e6 b: v+ k9 Y  X$ `
复制代码

" F3 J' `3 b: d- _Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
( h# P9 \+ E! ]1 L5 i! Q/ N7 r3 k" T# i

代码如下

  1. //连接服务器
    3 o; s' Q6 s$ Q/ x) i1 t: q  ~  ?
  2.     const socket = new WebSocket('ws://lm.com:9502');
    ! S/ N" D& h; p. w$ c, L+ c
  3.     //Connection opened9 u( V" p& P0 ?4 A( G
  4.     socket.addEventListener('open', function (event) {- a+ A; m# M, ]0 m" J* G9 e
  5.             //发送消息给服务器
    : i! B( [) G4 h2 p5 \. S3 z) T
  6.         socket.send('Hello Server! im websockt');
    6 ~; I& I5 a5 |0 C
  7.     });
    3 }" V. F9 ]) l; Y
  8.     // Listen for messages0 h/ v0 v0 u8 w9 X
  9.     socket.addEventListener('message', function (event) {
    6 ^! I  S6 y" P7 Y- \! R7 D
  10.             //接收服务器返回信息
    3 j- l+ T# g3 J; C; F- A
  11.         console.log('Message from server ', event.data);
    ! j7 \) b2 ^* s% b. ]
  12.     });/ S9 b8 r. W9 J
  13. 0 Z$ a. M7 z2 L
复制代码
伪直播主播页面
1 i4 S& P& h  R5 m% W! ^  x

html

  1. <body>3 G; @- x5 T7 d: x4 b. A2 Q3 P! K4 l
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>% o8 n; Y' J; o
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    ! `; F2 ~8 A9 O
  4.         画布
    , p+ v% u0 k7 p2 P0 c
  5.     </canvas>) H2 `: i6 E8 H2 S' i
  6.     <img src="" id="videoImage" width="350" height="700">2 d+ C" C& a& X; L" p3 q
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>; k! i4 n& a. G% q* G. |3 H* I' Z
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>6 _) L3 s( g! ^4 N3 A$ F
  9. </body>$ H4 p* q& i5 r4 U; u8 t% t2 m
复制代码

javascript

  1.     var v = document.getElementById("myVideo");$ E; s, U$ L9 g! |9 l$ o2 u1 }
  2.     var c = document.getElementById("myCanvas");
    $ E, e! `5 d) d% Q" d* ?+ z
  3.     // var c = document.createElement("canvas");
    4 y% j3 Q5 |. C9 K) r+ e+ z
  4.     var img = document.getElementById("videoImage");8 E2 s2 t+ L2 T$ M9 s" P
  5.     ctx = c.getContext('2d');8 I8 z3 I) V% U* A. Y$ [; ^( ^
  6.     var dataUrl;& ?0 O% R5 }4 b( ~0 U" h
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    4 \; z- N; A& k% Z
  8.     //Connection opened1 |6 z: S; g! L8 j8 `5 m3 K
  9.     socket.addEventListener('open', function (event) {
    # [& a- [/ a5 J) c
  10.         // socket.send('Hello Server! im websockt');) x, N1 D, W) i
  11.     });% J4 c& W, R7 Q
  12.     // Listen for messages
    ( ^9 }5 s0 g) w" s+ a
  13.     socket.addEventListener('message', function (event) {% K7 a9 @+ e* n& k' T4 X% L
  14.         console.log('Message from server ', event.data);; Q1 u' E) W; s
  15.         img.src = event.data;- D3 q) F5 r% b) A
  16.     });
    $ K) A) E" n' t# e
  17. * n1 s, p* D: W/ h
  18.     function playVideo() {
    & E' T! ]* L' D. u# A
  19.         ctx.drawImage(v, 0, 0, 350, 700);+ w2 F2 d% q: |/ u& d: U
  20.         dataUrl = c.toDataURL("image/png");
    ) K6 _' I( k: t
  21.         // img.src = dataUrl;
    7 \: X* n8 r$ N! y. k1 p
  22.         socket.send(dataUrl);
    ' M( [& G+ ~% e) q0 b1 }2 |
  23.     }# s" g7 h# A1 a) r( C' T
  24.     var tick;
    - {. R- b; @% v! A2 y
  25.     function aphla() {$ z+ k  q2 z; ?3 N' a9 I
  26.         tick = setInterval(function () {
      H! J, E" H1 Z" B! W4 k2 j9 P
  27.             playVideo();/ N& t: a) \7 j% A$ ~. |
  28.         }, 1);* [5 y/ k1 s% ]- d# |; F
  29.     }
    * t/ x6 F/ z* B( B2 m; z) q/ l2 W
  30.     function vdStop() {
    6 X1 r! ?! A; |- s2 P. w- Z
  31.         clearInterval(tick);" V9 n# _- V* v4 J% p( H3 j  ^
  32.     }, M' s8 A2 @- v$ ~; w
复制代码
用户页面
1 T5 B- U& }4 y; X

html

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

javascript

  1. var img = document.getElementById("liveImg");' p/ y5 S5 P% Z  n: l, {- [
  2.     const socket = new WebSocket("ws://lm.com:9502");
    4 z7 b7 y/ Z, [0 k6 O" r
  3.     //
    + b3 r, y9 e$ v4 i/ d/ U- o
  4.     socket.addEventListener('open',function(){. i( Z" K+ v2 E3 _+ K* W  ]& p
  5.      socket.send('Hello Server! Im live.html');
      w3 f' d+ n. b) O0 ?
  6.     });
    5 X  B% H% ~1 C
  7.      // Listen for messages
    0 X  G9 U1 h/ z7 V/ ^; b
  8.     socket.addEventListener('message', function (event) {" Z  C, e0 A# H. R7 y4 `
  9.         //图片地址
    2 k* K8 A/ T4 _7 [6 }: J5 y  b
  10.         img.src = event.data;
    4 t1 z9 T  l7 a/ Z
  11.     });: N* K0 s8 H$ z/ O9 Q
复制代码

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

! h, }2 y3 A% Q' |8 x% d3 g
  e  z- y! }5 |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-8 20:55 , Processed in 0.125338 second(s), 21 queries .

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