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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    7 Q( b  E0 [# j8 `; s3 l$ f8 O" ^
  2. //创建socket服务' ?) t% `* G6 D" `6 K' `4 r2 |
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    % c: Z) P! Z' D' @! ^& ^7 w9 C
  4. //监听WebSocket连接打开事件1 z! @! X& @+ V& r
  5. $ws->on('open', function ($ws, $request) {& K# O2 w0 u  T" ]
  6.      var_dump($request->fd, $request->get, $request->server);' X/ _2 M2 F4 j5 w1 S$ w
  7.      $ws->push($request->fd, "hello, welcome\n");* i7 a0 C8 N/ H$ f7 c3 G
  8. });5 w8 b/ u! I$ q8 `5 B
  9. 5 b5 P9 B, e* z& @
  10. //监听WebSocket消息事件) b4 b0 ?. h; R. v2 w* X6 x& q
  11. $ws->on('message', function ($ws, $frame) {
    : H$ `: H- o. q9 o2 s2 c
  12.     //推送消息给所有用户6 a4 [" Y4 [% K9 @2 p: d8 W) Y
  13.     foreach($ws->connections as $fd){
    # i3 g0 h' Q7 w- c0 |8 n# a
  14.         $ws->push($fd, $frame->data);$ e' }1 A1 Q: E
  15.     }! j' I3 r5 r% G& W, n1 O
  16. });
    + \/ p' e. J( q1 n0 _; @

  17. 9 ~$ I/ J# B) O: B2 d  r) x
  18. //监听WebSocket连接关闭事件
    " k  }' P, c* k
  19. $ws->on('close', function ($ws, $fd) {- c# \: F# s- i. ^+ |- w9 `
  20.     echo "client-{$fd} is closed\n";
    ) [. E% S  g: y3 f# A& W& v5 A
  21. });
    # b# j7 X7 K& H7 W* v8 Q. O
  22. //启动服务( k* I7 b2 q/ j5 B# |5 X
  23. $ws->start();
    + K& [2 n- j8 H: a6 G% j( V

  24. 7 i% Q- D; R8 d. s( Q
复制代码
$ @8 g2 e$ ~. E/ O6 q/ d
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端" a- _- [) J' l; D' g3 i5 W& o4 l

代码如下

  1. //连接服务器
    5 s4 G/ P& e  t: ~
  2.     const socket = new WebSocket('ws://lm.com:9502');
      I0 y4 ~' J3 }$ p4 r, ~
  3.     //Connection opened! s. z( k. q( c2 n
  4.     socket.addEventListener('open', function (event) {4 U- r% s1 w/ N/ ^5 N5 N
  5.             //发送消息给服务器
    8 l' R) H- V- i( }) i% ?
  6.         socket.send('Hello Server! im websockt');
    ( N. n7 W9 P* s) G$ O5 x
  7.     });
    ) n; b7 c0 }  d2 W* j
  8.     // Listen for messages
    2 H: C/ v- c4 W# p5 R
  9.     socket.addEventListener('message', function (event) {" q, `# R. F' ]. V
  10.             //接收服务器返回信息
    6 `7 }5 Q7 p; p
  11.         console.log('Message from server ', event.data);
    2 m6 W0 O1 r7 X) }0 ^  c
  12.     });
    ; m* w( m5 n$ _, ^- ?

  13. , k% [3 Z; Y! P  p
复制代码
伪直播主播页面7 \0 v8 j7 Q" g) `

html

  1. <body>" W1 c+ c& \+ K* h+ U- J
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    5 o9 K/ P" I8 b1 [: f9 Z% b; S! A
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">- W( M8 R" r5 z
  4.         画布
    0 v) ^: B# ^% \, h8 U
  5.     </canvas>
    9 P/ ?6 o& D( ^' Z7 Q1 A
  6.     <img src="" id="videoImage" width="350" height="700">
      W( [1 I+ J1 {: b" q  z
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>3 X2 @- M" z; @
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>/ ?+ l6 b7 l8 x: e
  9. </body>7 f- [; f& ^& f! Z7 Q) _
复制代码

javascript

  1.     var v = document.getElementById("myVideo");' o0 v" H1 T5 N8 V, A9 b, q3 n6 d
  2.     var c = document.getElementById("myCanvas");& z4 H+ O# N4 v& [
  3.     // var c = document.createElement("canvas");
    8 k, U; X" n$ r+ A# F& |$ @  _' r
  4.     var img = document.getElementById("videoImage");' e/ x+ F( S) {5 u8 c* p2 d
  5.     ctx = c.getContext('2d');% O& u& o! _5 U2 e- |) G; Q
  6.     var dataUrl;# E" X# y  ~5 S# z+ O: o( N( n3 c
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    . x7 y% {- D8 G; F  E& _% l
  8.     //Connection opened6 r& j9 E6 c& g/ X, l! Q
  9.     socket.addEventListener('open', function (event) {, @4 K" e$ }$ B! W( H1 g
  10.         // socket.send('Hello Server! im websockt');
    ( ~1 k. V, D! M' G  l
  11.     });
      h. m7 n3 j0 P# }- v) x
  12.     // Listen for messages1 z2 v" J- D- {& v5 [% j9 v3 `( o6 u* ]
  13.     socket.addEventListener('message', function (event) {
    " x9 t0 I; S& I8 m) ^1 g, ~% l
  14.         console.log('Message from server ', event.data);8 f" F2 t' C8 S+ f
  15.         img.src = event.data;% C$ W/ @+ @" k6 ^
  16.     });
    ) [( U: L/ h) Z6 G! `/ \* t6 Y( I# A
  17. 5 F; n; i" O: c( j1 h0 t* |( \
  18.     function playVideo() {
    . t; g, ?; r" o) T0 l
  19.         ctx.drawImage(v, 0, 0, 350, 700);* x4 T' {* Q4 a; r' u/ F
  20.         dataUrl = c.toDataURL("image/png");9 o0 i6 }; x3 _/ w3 T. [
  21.         // img.src = dataUrl;6 o+ _% ^- O2 C; T: Q2 S% E
  22.         socket.send(dataUrl);- C1 L  ]) A9 q' V$ s/ p4 ~
  23.     }
    # K) w* B4 a, K
  24.     var tick;# G1 p  `  Z  |2 Y2 F7 w. f
  25.     function aphla() {2 e1 n0 v2 Z" c, F2 ]6 u9 u
  26.         tick = setInterval(function () {
    ( g$ d: J2 n' {3 g4 d: V! O
  27.             playVideo();" E; d1 P5 C- s) F+ Z
  28.         }, 1);
    4 K' n* c. \) e' |
  29.     }# B- m( A& F, z% D# L; y6 r4 B
  30.     function vdStop() {
    % O* d' s/ M+ V9 u' S2 p3 |0 G
  31.         clearInterval(tick);- Q" U, q2 H/ u+ Q; b
  32.     }: m4 J' t0 O$ J6 ^
复制代码
用户页面4 Q# x1 ^+ X7 m  w3 A

html

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

javascript

  1. var img = document.getElementById("liveImg");, }7 o; J; f$ c, n- a
  2.     const socket = new WebSocket("ws://lm.com:9502");/ i) k* k9 I8 W- }& }
  3.     //
    ( N" s8 e" z& x& z0 b; q+ [, l
  4.     socket.addEventListener('open',function(){
    ( |4 e# \# B  ?1 P; \
  5.      socket.send('Hello Server! Im live.html');
    . u/ c0 `0 Y  G$ z. ]
  6.     });
    1 ]9 a4 x* T. w/ m' t/ }
  7.      // Listen for messages
    5 @2 w7 B: ~. w: q7 T1 ~& B
  8.     socket.addEventListener('message', function (event) {0 U8 V+ e/ I; t; l( m4 k7 [
  9.         //图片地址
    * o6 g& Z. l! e: H8 w5 L
  10.         img.src = event.data;
    ' o  s5 ~/ r: W2 M
  11.     });
    $ a, ^6 I' E* Z2 K! @3 j% R
复制代码

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


% X5 l. K( `% O- @) |; p6 Y5 M/ M8 t3 D! y6 E8 ^
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 03:08 , Processed in 0.048208 second(s), 19 queries .

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