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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  8 U. {* C' T  n0 @( n2 H: k
  2. //创建socket服务
    , j3 S/ L" ~; `+ f( }7 r; e
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);, i. m( p6 j5 X. G  X! |
  4. //监听WebSocket连接打开事件
    $ z! \0 g4 G4 M: B$ U7 ?
  5. $ws->on('open', function ($ws, $request) {! S7 t% m3 J* L1 g+ }7 g  _$ d
  6.      var_dump($request->fd, $request->get, $request->server);
    # c7 D: n9 S  }3 c, f/ W' a
  7.      $ws->push($request->fd, "hello, welcome\n");5 M1 \$ D4 g6 ~7 x, F, [! f5 p+ W
  8. });/ \+ X) K  p6 n; K# t
  9. ! Y  t2 m  ?+ y5 H% C5 a
  10. //监听WebSocket消息事件
    + a1 R- P  A4 ]* n  M
  11. $ws->on('message', function ($ws, $frame) {
    5 L* Y+ D. y9 U$ @7 w) u& R3 T
  12.     //推送消息给所有用户
    ) X0 H, U" Q- L2 y. ~
  13.     foreach($ws->connections as $fd){+ J/ x% Q5 t5 I4 J- V9 g- E
  14.         $ws->push($fd, $frame->data);2 H/ k* {7 \7 M8 y# ^0 {
  15.     }* p& S# I6 L/ b; V$ l3 H, r
  16. });
    1 p/ k- N2 c8 H
  17.   H9 N6 k# }3 u- S8 J# E1 E
  18. //监听WebSocket连接关闭事件8 v6 j9 U. C: d8 R, t
  19. $ws->on('close', function ($ws, $fd) {- o6 I% |# p# I: X6 h2 c, U
  20.     echo "client-{$fd} is closed\n";# b9 V# ^& w' q3 v9 v
  21. });
    # S( b! `4 F4 R
  22. //启动服务5 `1 J, p9 C, H8 S" |
  23. $ws->start();
    1 X/ J: e; r: n& P* |/ ~
  24. 5 b& Q+ c4 W$ c8 ^* D6 q9 ]- W! N
复制代码

6 Q6 B/ ^7 ~4 [Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端3 n/ s# o; ?0 N% i( p: A! l8 H

代码如下

  1. //连接服务器
    4 m+ M8 F: q' ?% w
  2.     const socket = new WebSocket('ws://lm.com:9502');  b+ g" d6 ]$ I4 M+ s3 z& x" V
  3.     //Connection opened
    $ i5 \- [- B8 M& R" ^3 f
  4.     socket.addEventListener('open', function (event) {
    ) @* B6 R$ w* ^/ m2 x6 Z$ j! W6 }
  5.             //发送消息给服务器
    ' p9 S3 ~4 j- D7 x
  6.         socket.send('Hello Server! im websockt');
    1 U% X2 B  }. h
  7.     });3 I3 x1 E) k: s3 {( L
  8.     // Listen for messages
    3 H& t5 n( V& F! Y
  9.     socket.addEventListener('message', function (event) {1 N9 B' h; y; Y0 O0 _: q
  10.             //接收服务器返回信息/ `- w, B: p" @: Y+ }. T9 M$ H
  11.         console.log('Message from server ', event.data);
    - k# j& a3 X! [* X9 g
  12.     });
    * _% l8 ?1 }% t& o

  13. * A2 k* S! l5 c" ]: ?
复制代码
伪直播主播页面% W0 V* I6 V" V7 {/ G5 N+ m% U

html

  1. <body>
    3 r! u0 @3 A( |; R
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>0 e/ E" a: K; [* D, y: X2 C) ?
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    8 N" x2 e, a/ m
  4.         画布
    4 t* X% a' ]  k+ \' n( h" z0 J2 _9 E5 T
  5.     </canvas>
    2 R, y% J6 F- u
  6.     <img src="" id="videoImage" width="350" height="700">5 f1 P( O' A& H6 q+ x0 j( u
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    " t( H5 K' p- ^+ Z* X
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>1 s" M8 \' @5 l- v" b" T
  9. </body>
    $ ^" I5 n! m) h
复制代码

javascript

  1.     var v = document.getElementById("myVideo");, f  d1 k3 ~8 I0 x! l5 Q! K
  2.     var c = document.getElementById("myCanvas");
    9 b; p. E! h6 C  B3 j
  3.     // var c = document.createElement("canvas");
    * z9 @9 a, {% L! A; A! N2 @5 H
  4.     var img = document.getElementById("videoImage");7 p+ P* s, U& E$ X
  5.     ctx = c.getContext('2d');& J2 z5 b7 P- X1 z$ }
  6.     var dataUrl;) `7 t+ P$ y* v, Q
  7.     const socket = new WebSocket('ws://xxxx.com:9502');' U" K# a$ |# a
  8.     //Connection opened
    6 T& ]3 ?" r5 L
  9.     socket.addEventListener('open', function (event) {
    $ @2 Q! A5 |  F+ U' y. M- X5 S/ j
  10.         // socket.send('Hello Server! im websockt');
    7 M7 J0 D# D4 S( S* O6 F( Q
  11.     });
    - a1 D8 P/ s$ x+ u8 G# |. \- q
  12.     // Listen for messages
    8 @; f% B0 C1 m2 m5 e( I
  13.     socket.addEventListener('message', function (event) {9 j7 O& Z9 j+ S* N
  14.         console.log('Message from server ', event.data);
    4 V2 @" T# g( Y: }
  15.         img.src = event.data;1 ?, U1 L0 X9 a# H* U% R& X* l
  16.     });
    ( I6 s6 [: w7 V4 T. b% T/ w

  17.   P0 h" m. @% ]+ g0 Q8 L3 _
  18.     function playVideo() {7 t9 Q, x9 p/ M* P  i4 F
  19.         ctx.drawImage(v, 0, 0, 350, 700);9 [/ j! X  s# u' ^4 }/ b
  20.         dataUrl = c.toDataURL("image/png");* H  F& B+ i7 r" H( [  {7 z. l
  21.         // img.src = dataUrl;
    % \& s: H  v, C+ a$ E
  22.         socket.send(dataUrl);4 e& m( g- P9 {: w9 C1 q! V$ |
  23.     }2 q; o6 J6 Q1 ^+ U/ {
  24.     var tick;
    5 k" ^0 `+ o# p
  25.     function aphla() {2 W6 d: |, L, V9 }. @6 c$ x
  26.         tick = setInterval(function () {
    ! n9 O0 T: t3 T3 M- Q4 s
  27.             playVideo();# a" q% L' |4 a" l0 A
  28.         }, 1);8 g; ^5 D1 t+ Z; ~$ h2 @$ [
  29.     }
    5 K- g$ q  {6 p! E( }. m0 r: W
  30.     function vdStop() {
    ; I6 s( B/ e& I& L& ~; N0 H
  31.         clearInterval(tick);8 A' W, Z" M4 ^" |; Y& ~
  32.     }
    - z, b. h1 k* D( m. {# k
复制代码
用户页面2 J( m7 H# o' V1 w

html

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

javascript

  1. var img = document.getElementById("liveImg");
    - E" _9 b. y1 ^0 a7 Q
  2.     const socket = new WebSocket("ws://lm.com:9502");
    " u* l; Z) F% j& o! a9 D
  3.     //
    ( z; C4 ^8 X$ F/ g1 K: e! ]
  4.     socket.addEventListener('open',function(){
    0 o, r7 R8 }8 X' O
  5.      socket.send('Hello Server! Im live.html');
    0 i& Z. l; B- P4 K; i
  6.     });
    + H4 \% _/ M8 y% ?
  7.      // Listen for messages* o. x* [1 l0 o
  8.     socket.addEventListener('message', function (event) {. }- [3 X3 L8 u( j
  9.         //图片地址8 ?' z- r' y0 m$ ?9 U, v+ G
  10.         img.src = event.data;
    ' M' P" ^+ V3 P3 Y0 M
  11.     });! H( ^7 M+ A1 r# D
复制代码

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


7 L: O/ q' ~/ W9 S2 P* N5 e( N% Y% U; K/ d8 C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:39 , Processed in 0.079524 second(s), 19 queries .

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