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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  ' n5 P6 c* q, v  I+ M- N, {
  2. //创建socket服务3 \/ }3 A; S0 l
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);& H$ @3 x" l* x6 W& g( s" \( l+ y7 L3 u
  4. //监听WebSocket连接打开事件
    / q5 p9 H- V: t; V# M* x
  5. $ws->on('open', function ($ws, $request) {5 O0 A9 W+ Y  L2 o( Z6 n% \
  6.      var_dump($request->fd, $request->get, $request->server);+ L- i% m3 c  G0 o- H6 X6 e* p
  7.      $ws->push($request->fd, "hello, welcome\n");3 C" W8 |. T; ^( \4 C# E
  8. });4 w( L/ y' C" P. i- K6 q4 I' J
  9. & L1 A4 S3 r+ h, e9 F; ]
  10. //监听WebSocket消息事件1 O! v3 `" x# q0 U
  11. $ws->on('message', function ($ws, $frame) {) _! P& p5 A0 c. U2 k7 Z* X
  12.     //推送消息给所有用户
    / t. p8 g0 M. J+ |( _: a1 n2 x6 G7 p: `
  13.     foreach($ws->connections as $fd){2 u, m1 R' W3 E1 i& o' [3 D
  14.         $ws->push($fd, $frame->data);
    , O# Y5 u% j6 P$ J, K6 `0 I
  15.     }, T1 r  p& C- p. G5 v/ G
  16. });
    8 p9 R9 Y: J1 S; n5 H, {: ^) r* A

  17. ; T# `) e% B2 J1 q! _& {
  18. //监听WebSocket连接关闭事件
    + ]8 H3 b  Z! d+ j" n9 p
  19. $ws->on('close', function ($ws, $fd) {
    # b9 M+ r  Y" Q3 \2 [* l9 b/ Q- u) T: l
  20.     echo "client-{$fd} is closed\n";
    " v! d2 Q/ E  m# ^- H, ~! K
  21. });
    # z- P# D. I. H! A. l" ?- w' v" x
  22. //启动服务
    " a$ H8 J9 H. b3 T! E3 p3 V! d
  23. $ws->start();, Z3 J3 G# A9 h

  24. 5 k: a$ ~, c' ]3 W1 I- g% M
复制代码
7 K5 a& @2 [9 H2 g
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端6 E3 h, b2 d. M8 L! x( t

代码如下

  1. //连接服务器
    ! [) k2 D7 Q, `% ~
  2.     const socket = new WebSocket('ws://lm.com:9502');
    $ b: Y5 L' f9 `
  3.     //Connection opened% v* H3 E5 K( {; I
  4.     socket.addEventListener('open', function (event) {7 ^/ ?/ w' z$ j' q+ ]+ x; O
  5.             //发送消息给服务器
    # I) {2 U# x6 ~
  6.         socket.send('Hello Server! im websockt');* O/ x3 d& K/ o
  7.     });4 u* {1 {- u8 g1 P
  8.     // Listen for messages8 F3 p/ a/ R" A/ y' r
  9.     socket.addEventListener('message', function (event) {
    ! n6 `1 v- ~7 V) Z) z+ |$ R
  10.             //接收服务器返回信息
    ' W# ?8 _. I* V; D- R
  11.         console.log('Message from server ', event.data);
    9 }+ I2 n/ H; G5 h5 `
  12.     });
    8 r4 a1 \; `/ o$ L+ U* D# k

  13. " H2 }3 ?# Z  \4 @0 [7 R( t& B5 W  u7 X
复制代码
伪直播主播页面
, X# o3 o% I  T# o3 s9 u8 u: W* L

html

  1. <body>
    " S$ k1 B4 S2 y% r; o) g
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    / E# ~" Q8 s! S4 J& r" G, [* ~% \
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">, J) H4 z5 m' e( w( ?
  4.         画布
    1 ], u) q4 T9 s* c, s: G) y
  5.     </canvas>/ p2 I+ L6 }! H8 S9 a" P7 ?) q
  6.     <img src="" id="videoImage" width="350" height="700">
    % e6 T. N# l& h6 T- ~$ r( G
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>$ o! b- f' `8 s
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    & S% ]* k$ Y4 E- W7 m+ E: y
  9. </body>% K: n. p1 A2 a3 ^2 O) e
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    : Q( d; K4 n! q7 n7 {
  2.     var c = document.getElementById("myCanvas");0 o% n* W( W& E7 B1 C
  3.     // var c = document.createElement("canvas");8 e( k; x4 }  b; n
  4.     var img = document.getElementById("videoImage");2 c, H( _% r  j6 y2 t
  5.     ctx = c.getContext('2d');7 d5 \7 E0 q% l; \8 _0 F& {9 d9 i7 z: m9 _
  6.     var dataUrl;
    1 A$ B# p' U# Y+ i7 Z. q# c# t
  7.     const socket = new WebSocket('ws://xxxx.com:9502');9 s" `4 i9 t4 Y8 G
  8.     //Connection opened3 Y2 o2 ~& N: s& f! Z
  9.     socket.addEventListener('open', function (event) {
    % k( N! `1 S3 j1 t) U' t0 ]. b
  10.         // socket.send('Hello Server! im websockt');
    : u! w) B: m% G8 |, f8 P
  11.     });7 N7 k/ X- h2 l6 e. r# P3 [4 ~
  12.     // Listen for messages3 x! n9 w8 D1 a5 T
  13.     socket.addEventListener('message', function (event) {
    7 W  c0 M  @! W3 J, r* A! @
  14.         console.log('Message from server ', event.data);
    7 A+ x9 m7 u9 L! o/ D3 y
  15.         img.src = event.data;
    1 t+ F6 J; `/ G* H
  16.     });
      w8 m3 f# v! E; ~2 v2 P1 |

  17. ( J0 k- Z! c3 F; ^" l/ m
  18.     function playVideo() {
    : H( R: `# @4 X
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    & H7 Z9 G  ]/ O# q) I' h) {! N
  20.         dataUrl = c.toDataURL("image/png");
    & l" K9 `; u$ q" Z$ v" S. V$ `
  21.         // img.src = dataUrl;7 a5 z( A% H2 h! h" k9 J
  22.         socket.send(dataUrl);
    # V! }  g  e9 L/ w) u5 e' Y6 k6 v
  23.     }
    - J  L  D8 b3 f4 b/ _
  24.     var tick;/ G# a: d5 T+ W$ w. g
  25.     function aphla() {
    + m( E- p* a5 M* d- q5 d
  26.         tick = setInterval(function () {
    5 t+ A0 o6 `; u3 S9 T  }1 C" h
  27.             playVideo();
    8 u( n$ E5 K8 \4 |2 _( P
  28.         }, 1);; y( I6 d1 f4 `) h% c- J  c
  29.     }
    * [$ g2 A& c  u5 f, t* ?
  30.     function vdStop() {
    3 V* g* W" U# N5 O0 ?6 `
  31.         clearInterval(tick);% F- N) c! j) M7 H
  32.     }, ^  h* I) \8 I7 F+ `
复制代码
用户页面
0 L6 S6 f. y; R3 ]8 Q$ r! j

html

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

javascript

  1. var img = document.getElementById("liveImg");" h, q3 g. A  ~5 S+ g& f5 Y! c
  2.     const socket = new WebSocket("ws://lm.com:9502");
    / |5 `8 R: J+ k0 ~
  3.     //
    % P% J5 {! Q2 W, v. o* G
  4.     socket.addEventListener('open',function(){9 E! l( B8 q6 D
  5.      socket.send('Hello Server! Im live.html');
    ( u: i8 A9 }  l% k: E8 H' z8 H
  6.     });
    & m) n! x% S7 v2 c9 Z" g
  7.      // Listen for messages7 q5 a( |; {4 x* {7 Z0 Y! a6 D
  8.     socket.addEventListener('message', function (event) {  y2 n5 ]/ k0 Y# ^: V, X8 }0 l# A
  9.         //图片地址  S+ _1 C4 v- {. c3 h! P) ]7 a( `! m  R
  10.         img.src = event.data;0 `! ], E$ Q. d6 n' y
  11.     });
    # h7 n4 E& W; b4 O: l
复制代码

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

9 g; I4 ^: c3 o  E

1 y, U% H4 p; @3 u; F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-5 00:00 , Processed in 0.051918 second(s), 19 queries .

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