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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  ; F$ X0 p: j6 O2 l) |
  2. //创建socket服务
    / P6 x& H9 t" v- V5 U0 i
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    $ l; l! a3 a8 {+ f
  4. //监听WebSocket连接打开事件
    ! q( H! d( P! j9 ?  Y3 G8 A6 [
  5. $ws->on('open', function ($ws, $request) {
    , s' y9 |- H6 F; s/ s) D
  6.      var_dump($request->fd, $request->get, $request->server);# Y- G: M) c1 J# K/ Q
  7.      $ws->push($request->fd, "hello, welcome\n");
    & v6 \$ {$ _& `" U
  8. });
    6 U2 C( c5 ^8 O- l

  9.   t6 R- h; c% Z/ F$ }
  10. //监听WebSocket消息事件$ G+ P+ @# N5 a# a. U1 j+ ?  A
  11. $ws->on('message', function ($ws, $frame) {6 n* g/ N0 n" l6 ^  g- R! j
  12.     //推送消息给所有用户  R% U$ v. V& s* f# ~# I/ K. ]0 l: i
  13.     foreach($ws->connections as $fd){, k6 U1 |; l9 b. C: r2 t
  14.         $ws->push($fd, $frame->data);
    ) _8 c$ t& `6 }' v
  15.     }( G5 K. W3 }8 W$ z; U
  16. });! z+ w. B! i% \# P$ V5 Z$ Z! j

  17. 8 Y& K$ Y5 c% H+ N& Z" o
  18. //监听WebSocket连接关闭事件
    8 v5 G$ x9 ~8 _
  19. $ws->on('close', function ($ws, $fd) {
    " }$ G! [! l1 l& y
  20.     echo "client-{$fd} is closed\n";8 W( P5 |; K. ?3 i( ^4 E
  21. });
    " b3 m, o# y  C  n. |. u  A
  22. //启动服务0 {8 d' ^% q: ^. O* r: M* V6 d0 V6 ^
  23. $ws->start();! u3 u: Q2 N! [

  24. / j% `3 p/ B0 a  ]5 j" F% @) @
复制代码
' z3 |" p: I- Z. z% Q, k$ `
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
5 E) O5 T8 j) Z

代码如下

  1. //连接服务器( V& ?" ?  ?3 @
  2.     const socket = new WebSocket('ws://lm.com:9502');
    + L" M% H8 A2 F
  3.     //Connection opened
      ?2 M7 n- ]$ \& f. ~
  4.     socket.addEventListener('open', function (event) {
    + S; c" J! i) |( z0 W! x
  5.             //发送消息给服务器) j# m  ~+ r: X$ {4 K2 T/ U
  6.         socket.send('Hello Server! im websockt');
    % s4 W% H) M$ W+ n) v' ?
  7.     });/ N) _& `! P7 W' a
  8.     // Listen for messages
      {* ]: \4 ?! G/ V
  9.     socket.addEventListener('message', function (event) {
    / L+ y' e# V; C6 z4 N0 }
  10.             //接收服务器返回信息! F& D' U! X0 _$ Z( n$ `
  11.         console.log('Message from server ', event.data);1 B8 L$ M- z, z9 ~9 h+ ?9 x5 O
  12.     });
    " E( M5 T6 {& E, `! X  V
  13. ) a2 J* Z$ K. Q. p: G
复制代码
伪直播主播页面4 ?; l) T. c/ [& j& a6 r* m

html

  1. <body>* F' y3 W% e2 g5 ~
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    : }$ M3 Q2 S" @$ E! Z! o8 k0 p
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    2 X, z4 c( U, j* ~) M) o% I! ^9 @- f9 E
  4.         画布
    ! D. X# B6 ~) c3 {- r6 x
  5.     </canvas>5 R8 i* w. ?7 r' n. ?. ?, c$ g) U
  6.     <img src="" id="videoImage" width="350" height="700">
    + |! {0 o+ Z! h; E( j' i7 S
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    6 W6 }+ J2 v9 }; U: O) c& q
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    5 m3 f7 m" ^. M7 a: x0 c
  9. </body>3 l" n9 N- n' g0 Y3 d$ {' t
复制代码

javascript

  1.     var v = document.getElementById("myVideo");9 f& L$ Y# N" Q4 J! ^# P0 s
  2.     var c = document.getElementById("myCanvas");
    ; b! [/ W5 ^# s7 P- ]- q/ ]7 g
  3.     // var c = document.createElement("canvas");
    4 C6 Y' M% k! y5 T0 I% E, z3 b
  4.     var img = document.getElementById("videoImage");
    ' b4 B5 }, q: _+ v: b
  5.     ctx = c.getContext('2d');. X9 L+ f, I$ b4 y8 w3 I' k' ^
  6.     var dataUrl;; {0 S8 Y2 P  z
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    1 `) M+ t' l3 C- d7 T6 q: V
  8.     //Connection opened
    1 m) [6 q) q7 Z
  9.     socket.addEventListener('open', function (event) {! P7 K* i- p; Q! ^, s! d' S9 q
  10.         // socket.send('Hello Server! im websockt');
    8 w% c$ T6 k% x2 Q2 F, d+ e- j
  11.     });
    / R/ c/ E7 g  ~  P. e& z3 X
  12.     // Listen for messages
    3 V6 [2 R* e$ r( F1 M1 Q" x
  13.     socket.addEventListener('message', function (event) {1 W- H8 l! T0 M
  14.         console.log('Message from server ', event.data);
    # ~; W2 y" [$ `) i1 Q! A$ Q1 n  j
  15.         img.src = event.data;
    % m9 a6 R) Z( K
  16.     });9 n5 h3 k7 o, C3 k

  17. : ?0 p0 r! w: S5 I& W8 j2 z- ?
  18.     function playVideo() {3 F: j! c9 x! b1 v( t2 Z
  19.         ctx.drawImage(v, 0, 0, 350, 700);4 o5 z  X, V$ b
  20.         dataUrl = c.toDataURL("image/png");  P2 Q5 {: u$ V6 R% @, b6 r4 [2 `
  21.         // img.src = dataUrl;
    9 x9 B9 X2 C4 B$ V; l
  22.         socket.send(dataUrl);4 S6 l- q% i* |
  23.     }
    - y& S3 Y. U* W. B- z; L4 x$ J
  24.     var tick;
    5 s4 ^. h& e$ P$ f+ M& A
  25.     function aphla() {6 n7 F, \5 Z7 |
  26.         tick = setInterval(function () {
    : x- M$ Q. _  @% E" r9 ]
  27.             playVideo();: ]/ {! A. a* j8 \) r# c" C
  28.         }, 1);
    9 q5 v* W' t+ w- n# J, b8 L- x
  29.     }
    ( j2 X( {8 {5 Z- y5 _9 q) a
  30.     function vdStop() {
    % K4 ?  m" `% a5 D
  31.         clearInterval(tick);2 y3 z: m+ |! G3 e" `% w# e9 w
  32.     }6 `8 g. P" L9 d6 V& r
复制代码
用户页面) n: L# A, U% I$ Z

html

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

javascript

  1. var img = document.getElementById("liveImg");
      o) o7 y6 l( L% b1 {2 j
  2.     const socket = new WebSocket("ws://lm.com:9502");, q/ Y. {! c" T) T/ t4 v& D
  3.     //
    ( V' h+ e$ F! |* w) b. Z2 h
  4.     socket.addEventListener('open',function(){# {3 |  x& a% ]1 r% j8 q% i
  5.      socket.send('Hello Server! Im live.html');0 W' f8 j; j5 R' E+ i
  6.     });' A% s8 c- P# q
  7.      // Listen for messages# u5 N1 H. B0 H7 s3 C
  8.     socket.addEventListener('message', function (event) {7 p' r% A, L6 i: ?4 V% N
  9.         //图片地址0 i) Z9 g6 `7 O* h7 x9 v
  10.         img.src = event.data;; A& _) _1 q- i0 U( `
  11.     });
    * v- [: _7 p) [
复制代码

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

, X5 J4 N/ u$ n6 z# ^0 g; P: J

  f* V% \; {2 @7 g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:44 , Processed in 0.050632 second(s), 20 queries .

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