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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  # I2 W3 `7 h6 _6 q
  2. //创建socket服务
    . d" s7 v& F! X0 E: V. D% e$ W
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    ( T3 V: l% ^4 J9 G3 l3 y
  4. //监听WebSocket连接打开事件, v3 z3 @/ [& }' C
  5. $ws->on('open', function ($ws, $request) {7 ^6 T% G. f0 e# h- v$ L; [) T
  6.      var_dump($request->fd, $request->get, $request->server);2 y& x4 t8 x7 e& c; ~+ j
  7.      $ws->push($request->fd, "hello, welcome\n");
    ( y2 {* x: }3 E8 P3 e. R" ?/ e
  8. });8 @2 L7 c. x. k% |

  9. ' T+ T* e' k9 W: J3 U$ Q5 t
  10. //监听WebSocket消息事件
    5 U7 l. K2 i' d9 a* {
  11. $ws->on('message', function ($ws, $frame) {
    : V9 p1 X+ C$ E8 `& J& a
  12.     //推送消息给所有用户$ g! R6 z# F2 A2 r. t
  13.     foreach($ws->connections as $fd){
    * w  k9 G4 O# v2 |) O
  14.         $ws->push($fd, $frame->data);
    8 I; F3 G3 V: Y. R& r$ W8 F
  15.     }
    2 v0 a& o; Y, R: V! B( _2 p  |
  16. });
    3 l9 X5 X- ]7 R. Y* A: k( M. u
  17. ; R% l5 q& ^/ Y
  18. //监听WebSocket连接关闭事件. v9 b/ f7 a- D0 j
  19. $ws->on('close', function ($ws, $fd) {& Y. H3 W) K5 N4 ?( {
  20.     echo "client-{$fd} is closed\n";9 z2 a: ]/ b( P  ~- f0 H
  21. });
    2 n: m* V  s, a: ]) F
  22. //启动服务
    & l5 e, I) L' r: J9 u* d5 C2 m
  23. $ws->start();; k* C) P1 w2 ~4 @/ U1 {2 y
  24. 9 }- r0 M0 m' k. m# {9 |% Q
复制代码

" K% k  Z& ]; EWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
& f' L3 K7 x# D5 J1 ?

代码如下

  1. //连接服务器( @; }' |8 a; {% K
  2.     const socket = new WebSocket('ws://lm.com:9502');# R% |% W" p; ~
  3.     //Connection opened( l) k4 M; y) _1 d& q
  4.     socket.addEventListener('open', function (event) {
    - O5 W( {. T) V/ {
  5.             //发送消息给服务器
    / q$ f8 x' B) q2 U
  6.         socket.send('Hello Server! im websockt');
    ; c! x! p! {7 L7 k- A9 a
  7.     });
    5 T/ v+ r8 l) `# L
  8.     // Listen for messages( U& U* ?6 f7 G- S! W
  9.     socket.addEventListener('message', function (event) {6 J( O( v- m) H+ i; R
  10.             //接收服务器返回信息# k, P7 w3 i  Z  _: i& F% H1 f; ]$ f
  11.         console.log('Message from server ', event.data);
    " z$ H* f1 A: D2 z3 l3 V
  12.     });
    3 L" k0 G! S9 t/ r* ^8 x
  13. , v1 E! W. y: h8 `) C7 D4 N+ X
复制代码
伪直播主播页面
2 i- c: C( Z4 s9 T/ C! N

html

  1. <body>
    , t4 N& t* y7 a
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    & p/ {* K$ x6 I# [$ U
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">2 r7 J2 n- C7 _* Z- O
  4.         画布' H$ d. x0 {& m
  5.     </canvas>7 ~& T! _% s/ Q. Y
  6.     <img src="" id="videoImage" width="350" height="700">5 S8 f  L, M. g! m+ D+ A( t
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>- w8 c* n' S% w- h- I
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    + c2 K& o. R% J# ^: a: ^
  9. </body>. D" Z9 A  p) p* e6 B
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    6 n0 P. F! m' u+ Q9 K/ m
  2.     var c = document.getElementById("myCanvas");5 D0 E9 P) g0 I5 }4 c  t
  3.     // var c = document.createElement("canvas");% e& c' @% ]- }) q& x
  4.     var img = document.getElementById("videoImage");! e) @- Z7 X* I3 I
  5.     ctx = c.getContext('2d');
    + l, z) ^6 v, i" B
  6.     var dataUrl;7 a3 _+ A+ B" R
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    . [+ ~9 J4 O* Y9 ^: u: N; i9 f
  8.     //Connection opened
    3 ?* z. m& z  J
  9.     socket.addEventListener('open', function (event) {
    3 z; W' A9 u" A4 l* M: a2 N1 E$ n
  10.         // socket.send('Hello Server! im websockt');
    + }9 Z9 A- l  _. j( y7 s/ u& t
  11.     });/ n! \7 k8 l. U) q$ Q
  12.     // Listen for messages+ e% ]& c. \& I8 B5 v  S' ^: |
  13.     socket.addEventListener('message', function (event) {
    . j. l9 J1 q* [6 A9 b+ C
  14.         console.log('Message from server ', event.data);) ~; x$ h; ]7 K2 w2 h# y( y
  15.         img.src = event.data;
    , T2 L: m5 K1 x5 S4 L8 R4 i: h3 c
  16.     });
    & s" x/ Q. T5 N% V& f
  17. 2 L5 F. w6 i2 _+ H
  18.     function playVideo() {
    : B! j) f& W9 Y
  19.         ctx.drawImage(v, 0, 0, 350, 700);' L- K5 R; T- p( Z0 d6 l$ u
  20.         dataUrl = c.toDataURL("image/png");
    ! n" q) F& `" \$ ~3 I" C- v  }4 X
  21.         // img.src = dataUrl;
    : K. B( h' F0 O& N, [$ b
  22.         socket.send(dataUrl);
    % n& x3 f7 k) J
  23.     }+ a) h4 D* @' r0 o: a$ H( N9 [
  24.     var tick;3 v' W& z4 R( y2 ?+ y$ I$ C  |
  25.     function aphla() {$ r" g9 e, t. F9 P9 K
  26.         tick = setInterval(function () {* G( Y+ r3 ]. w2 R- S: j
  27.             playVideo();
    9 B: h& ^5 J- @/ H3 R, Z
  28.         }, 1);
    # l& B2 N& Z1 _4 j# o
  29.     }
    " w9 u  |5 r. q. L7 n2 g2 Z
  30.     function vdStop() {9 L/ q- u' m9 ]( E+ T( p
  31.         clearInterval(tick);5 m% L( A- \* n1 n6 H
  32.     }7 s6 \5 N0 \/ B( [+ ]5 [
复制代码
用户页面
; h3 E( X9 @7 S/ p, t' ]1 F

html

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

javascript

  1. var img = document.getElementById("liveImg");
    1 H  a; s$ w- a2 y- s9 y: d
  2.     const socket = new WebSocket("ws://lm.com:9502");. T" U4 u. e/ v0 E% W; Z( b1 p) ]7 G7 u
  3.     //
    : Z! @* z1 w( {: F) [5 Q/ B
  4.     socket.addEventListener('open',function(){* [; O4 [  @7 ]& \) {
  5.      socket.send('Hello Server! Im live.html');5 G0 x$ C$ l& r  u1 L) I
  6.     });: m5 I' D3 h% e3 Z" q* i. Q
  7.      // Listen for messages2 ?& v- R/ x  h- ?2 [2 W0 q
  8.     socket.addEventListener('message', function (event) {
    0 i9 g5 h3 Q1 R0 U
  9.         //图片地址
    5 c7 ~3 o/ }0 i. W5 j: R
  10.         img.src = event.data;
    " v% Y: u6 e. U$ V  c6 J
  11.     });4 w' i6 D8 n: J9 `" W( E9 l
复制代码

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


* j. F2 O. l7 p' {9 r
$ Q. u+ O$ J# O0 y, H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-5 14:54 , Processed in 0.117404 second(s), 20 queries .

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