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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  ( x: X6 X1 T1 G7 m1 w% j6 ~
  2. //创建socket服务4 G6 U; D+ q3 M( [
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    . f/ e. x/ l" h; ?  c
  4. //监听WebSocket连接打开事件
    " ?* I0 I4 X# k" D( C% [# Z1 W
  5. $ws->on('open', function ($ws, $request) {: r4 N4 R6 z2 Y: B1 ]
  6.      var_dump($request->fd, $request->get, $request->server);/ Y. H5 P' o6 r% k9 k( L
  7.      $ws->push($request->fd, "hello, welcome\n");
    ; u$ `+ N/ Y- \5 S- y
  8. });
    0 E, m2 I2 ~% k
  9. + y/ b. y  I; M  k% \' X
  10. //监听WebSocket消息事件  X* w2 e3 p& l5 T
  11. $ws->on('message', function ($ws, $frame) {
    ; P, [6 I& h' n; f" k/ e8 o
  12.     //推送消息给所有用户
      m# S; f& g1 _8 j4 u& G
  13.     foreach($ws->connections as $fd){2 i$ K2 S! `$ }5 F- E
  14.         $ws->push($fd, $frame->data);
    ; z. l. e$ S) s' m
  15.     }
    * U, V6 ?; h. ]  N
  16. });
    % X7 H% B+ b+ y6 k1 g  n8 p

  17. * @8 n( z' o2 w. |- E+ \) U7 a
  18. //监听WebSocket连接关闭事件1 R: T6 ^: Y5 u0 a. ]4 ]
  19. $ws->on('close', function ($ws, $fd) {6 d( J' k9 p3 ]4 z" \
  20.     echo "client-{$fd} is closed\n";. q5 y2 A4 ~1 N
  21. });8 F, p3 U$ ~0 ~( }( X4 }
  22. //启动服务) b: K. ]& I, Y8 f+ f+ }- g; a
  23. $ws->start();7 y4 |, b4 s; T' G9 ^) f
  24. ' t8 A; v4 B4 Q2 S+ S
复制代码

( [8 q6 y3 G: O+ [0 n: y. LWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端- v; o; T! |  }

代码如下

  1. //连接服务器
    , e. K& B/ H' S
  2.     const socket = new WebSocket('ws://lm.com:9502');6 U. v2 s3 i8 \! V. M% X
  3.     //Connection opened
    2 |; l& Z5 F9 E6 a) ]6 o6 u
  4.     socket.addEventListener('open', function (event) {
      f# c1 M' }4 B" ?
  5.             //发送消息给服务器
    2 s  k& Y% u5 z* f/ E
  6.         socket.send('Hello Server! im websockt');( V9 b# @1 s+ m- L
  7.     });
    6 d; l% X" v- y1 A
  8.     // Listen for messages+ I5 k6 {3 \6 G! Q
  9.     socket.addEventListener('message', function (event) {" }8 F* X; t+ |6 Q3 M
  10.             //接收服务器返回信息
    0 O7 K$ W+ b: R; |
  11.         console.log('Message from server ', event.data);
    , M- _9 S8 ?% k5 N6 ?
  12.     });' e( B! c6 H3 ~4 M. w/ H

  13. : J6 c2 }& r( h9 T3 \; ^0 u( @
复制代码
伪直播主播页面7 R5 `; ^# d% r

html

  1. <body>2 A/ l3 Y/ B8 x7 b6 ~
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    : n: J# \6 v: x1 w8 v2 i! Q$ S
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">( ^" {6 h) z/ ?1 R' K9 z( U
  4.         画布
      _/ e; e+ b2 h5 g/ f2 e
  5.     </canvas>6 e# `2 }+ f9 g9 z0 V! f
  6.     <img src="" id="videoImage" width="350" height="700">+ i# [2 A# @7 m0 ]. j) R
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    & J4 O/ X% P6 a, ^( [+ r
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>- p. `5 B; Z5 d
  9. </body>4 c$ F' B5 D% L
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    # E7 f4 x2 S% h4 a% j9 t" Y5 ^8 r
  2.     var c = document.getElementById("myCanvas");/ l) J5 J- O- U0 |  \
  3.     // var c = document.createElement("canvas");5 B( h# `6 J! z, M! ~6 X
  4.     var img = document.getElementById("videoImage");5 o* |; N2 ^. A* Y) M
  5.     ctx = c.getContext('2d');
    7 B. }% F) N1 D  ^
  6.     var dataUrl;
    . O4 w' t* q- r6 y" g5 r: R  d/ Y( r
  7.     const socket = new WebSocket('ws://xxxx.com:9502');2 F3 R4 G% K9 L8 L$ T/ V" J1 M% W
  8.     //Connection opened3 }3 X! l& ~$ x- P+ Z
  9.     socket.addEventListener('open', function (event) {& [4 P' }! g. J( g: I) M
  10.         // socket.send('Hello Server! im websockt');
    3 q, [: V+ z, {
  11.     });
    % v# g7 S2 R& |+ M% f" g
  12.     // Listen for messages' B- u. J1 w/ g- p- N3 O0 p
  13.     socket.addEventListener('message', function (event) {! Z( Q, Y+ \1 A, V3 ^9 R% [
  14.         console.log('Message from server ', event.data);
    * S$ O1 V( v, T# _8 Y! Y
  15.         img.src = event.data;
    3 S4 ]& R9 g# n. [- H- F, O9 e8 G
  16.     });7 V6 j) K. X+ G! c2 q0 B; O+ B

  17. 4 S9 v) ]: g% y2 Y- X4 I8 B
  18.     function playVideo() {
      y5 S$ B* k, C  d8 N9 O$ e
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    + Y( j( n* Z: @6 I& x# }; g9 ~& n/ m: l
  20.         dataUrl = c.toDataURL("image/png");# H8 Y# P( w* m: X4 C( F
  21.         // img.src = dataUrl;
    * }0 z% P# J) k7 H. X
  22.         socket.send(dataUrl);
    , O/ V# ?% ^, X& E& ~
  23.     }& d: H6 y, Z7 B' E* n6 O* m) b- o
  24.     var tick;
    , I& K+ d, i/ f; d+ u
  25.     function aphla() {
      P& i) U# l! {7 u! i3 S
  26.         tick = setInterval(function () {
    6 |3 O$ \$ e1 x+ }
  27.             playVideo();
    % z' {8 I% l3 S0 t2 J; ^$ f+ z2 e
  28.         }, 1);
    ; y! y% B. y9 P/ _
  29.     }: z/ Z0 u7 c$ j( ~
  30.     function vdStop() {
    : ]4 v) M% n  a' W; q
  31.         clearInterval(tick);) |- P  W* V# `; Q( y  W8 U
  32.     }7 ^% Z* a. }4 N7 T
复制代码
用户页面
) R9 e- p  i& o) Y

html

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

javascript

  1. var img = document.getElementById("liveImg");/ d4 w- H9 b$ O  N  W& A. u
  2.     const socket = new WebSocket("ws://lm.com:9502");; b: f" j& n! C3 y. j
  3.     //
    6 B  I+ x  X: L+ d: ?! a2 s# {
  4.     socket.addEventListener('open',function(){
    7 @9 |" t$ L0 F2 g# z
  5.      socket.send('Hello Server! Im live.html');
    , e! ?  K3 P: c, k
  6.     });
    7 A& m! g: r' H( t  N6 M. g. @$ C( t7 q
  7.      // Listen for messages9 B% [7 T: E) F  L7 ^- n
  8.     socket.addEventListener('message', function (event) {
    . `3 b4 F, A0 X7 u7 S6 |. _
  9.         //图片地址8 p+ k5 P- e" _/ f; d$ `4 R3 H
  10.         img.src = event.data;
    ( k/ G4 G0 \$ K9 Z& [
  11.     });
    - D5 K! h! {; `# f; r% N
复制代码

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


2 u  j. y% {' h1 Z% N  C
  F* }# g) l$ ~% o$ Q( m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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