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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  1 r5 z7 p, t& W8 ?6 a
  2. //创建socket服务
    + r/ l: ^5 M! `2 J% w0 L# e4 X
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);: p! M2 q" R) ?4 U+ \
  4. //监听WebSocket连接打开事件
      D, }7 S) p$ E1 o5 F& x
  5. $ws->on('open', function ($ws, $request) {
    . R: o5 s) D* }$ k: m
  6.      var_dump($request->fd, $request->get, $request->server);$ `) D2 B% p* W% h# V' Z+ S6 f  Q2 C
  7.      $ws->push($request->fd, "hello, welcome\n");. p% C: P( g9 ]0 Y
  8. });
    ' R4 F3 I  b/ }1 x$ w6 }! _' O

  9. % t8 `4 [$ S# Q0 \1 V' I8 T: n& @
  10. //监听WebSocket消息事件
    5 R9 j) X5 a, W7 }0 @
  11. $ws->on('message', function ($ws, $frame) {
    ) L6 a$ i; \. Z8 _) X$ u$ ~# |
  12.     //推送消息给所有用户
    : w7 {% b9 D* t0 y, w
  13.     foreach($ws->connections as $fd){* v' L$ G4 {2 }) t9 J7 j! w& j
  14.         $ws->push($fd, $frame->data);0 L0 i" J  ]% y  i
  15.     }
    ! @6 ~/ V! o( a: C! P
  16. });
    : c* z4 S; _: i) P. h
  17. " K& b1 d4 w" m5 N( z
  18. //监听WebSocket连接关闭事件
    ' N( ~8 N; u3 Y+ a% R
  19. $ws->on('close', function ($ws, $fd) {9 B* j4 l' @/ a* }9 J
  20.     echo "client-{$fd} is closed\n";
    ) J. ?4 L! M. s. w; N$ `5 V0 ]
  21. });, _, A8 w! T2 n7 F
  22. //启动服务) K$ `' ]3 [) |5 ^. s) k
  23. $ws->start();
    ( ^( [; H/ `1 e7 j

  24. * q, _4 D5 K: N  H$ @: K) b0 t
复制代码

6 ^3 K2 u( H1 d- u; d# F1 CWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
3 L4 W. `# ^$ S

代码如下

  1. //连接服务器# {. u& a5 c' Y
  2.     const socket = new WebSocket('ws://lm.com:9502');
    3 _+ p  u* R) A% h, s% j, C
  3.     //Connection opened# z. |1 K9 R7 {4 s
  4.     socket.addEventListener('open', function (event) {
    2 K7 j3 B0 m! I9 D; ?9 q# s( n8 ?
  5.             //发送消息给服务器
    % w; K4 |& d  F6 M6 S4 s0 T
  6.         socket.send('Hello Server! im websockt');
    3 l4 h/ u: [: {. G
  7.     });% Z4 j* B0 o* Z8 a+ q- b7 @
  8.     // Listen for messages
    " @$ M0 s7 D1 H  h& |
  9.     socket.addEventListener('message', function (event) {
    - n3 r# w( t' C1 M( ^
  10.             //接收服务器返回信息
    " Q1 T3 Y0 y! v" f6 q* S9 m6 b
  11.         console.log('Message from server ', event.data);/ p" e: }, `) T( V: w' d8 M7 g/ u
  12.     });. `, f3 I3 v+ f3 ]6 D
  13. ( C- [% |- ]# i) {
复制代码
伪直播主播页面
2 F8 g& k% [. ~# y, `5 D

html

  1. <body>
    + \1 X# i, u, i7 ]: i1 G& Y  |4 |$ ~
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    ( \7 c" N$ @  Z* l6 X8 ~2 ^
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    ' _0 k  \( _. T$ [1 J! K( z
  4.         画布
    + E; \5 e" J( |3 v
  5.     </canvas>
    9 ^' h( d& ]6 I7 r
  6.     <img src="" id="videoImage" width="350" height="700">
    ! _6 j& N! j0 T9 B& l
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>- N( j( q0 {5 ~# @  x% u
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>8 ]" j* ]8 @/ c& K- k; F
  9. </body>
    * G8 u" ]6 b: L4 w) N" Q3 k8 r/ D+ e( D' w
复制代码

javascript

  1.     var v = document.getElementById("myVideo");0 J7 P% {4 C% D2 U! b6 P
  2.     var c = document.getElementById("myCanvas");, W  O2 |; Y) S7 ^
  3.     // var c = document.createElement("canvas");
    ( Q& ~. J, m  q7 h' N
  4.     var img = document.getElementById("videoImage");
    % P7 v, x6 J2 [6 v& ?& Q$ p
  5.     ctx = c.getContext('2d');& E. v5 Z+ V7 K6 z8 M' [
  6.     var dataUrl;
    ; Q# N& Q2 A& i$ E0 P9 }
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    2 a7 [3 G9 ~8 s$ U2 [1 C* `1 R
  8.     //Connection opened, l8 m# i, O* X7 e
  9.     socket.addEventListener('open', function (event) {
    * h& D1 i& M) i7 a
  10.         // socket.send('Hello Server! im websockt');/ i4 c3 v8 z/ Z4 [# D2 d1 e; I) A! y
  11.     });
    , d2 C) K; ]: ~) k8 z
  12.     // Listen for messages& }7 r6 m1 E" Z& e( r9 o
  13.     socket.addEventListener('message', function (event) {
    * g  h7 g' t( W
  14.         console.log('Message from server ', event.data);
    1 q- ?; k8 P2 b! \1 c* L* n! Y4 H
  15.         img.src = event.data;: l# G2 L' }4 G
  16.     });
    : r! O7 {3 e* J1 i: C/ D1 W
  17. 6 R1 ^1 {: ?9 e2 p* n
  18.     function playVideo() {, R- R+ x- B8 B! _% f* q8 I: i
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    2 M: P4 A7 w! t) ~, S4 F
  20.         dataUrl = c.toDataURL("image/png");- E( b: e" p+ y4 I" K5 j/ ^. r
  21.         // img.src = dataUrl;
    7 C9 @0 [  U  \2 x, j2 @5 `
  22.         socket.send(dataUrl);. I1 d" J7 ?5 g6 H! G
  23.     }
    % P. v4 P" Q3 D& P% \$ \
  24.     var tick;! `2 W. `. _3 J, ~* `% I
  25.     function aphla() {4 w+ Y6 ~, W! {6 V$ E7 T
  26.         tick = setInterval(function () {# n3 Q. D2 j; E- g0 t
  27.             playVideo();) K- ^$ }. e# X! U5 w2 v# q5 r
  28.         }, 1);1 P+ A/ M  a/ H5 K
  29.     }
    / H6 t* p; i$ S* _
  30.     function vdStop() {' B- a" a  Z. ^& s+ b- X- `6 S
  31.         clearInterval(tick);
    - Q& G9 m& S$ @- u2 V( R, t! ?
  32.     }
    / o5 n6 ?: ?: p2 L  d: Q% [0 O; v
复制代码
用户页面
8 P5 C+ I* Z0 G  E0 a# v2 P( z

html

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

javascript

  1. var img = document.getElementById("liveImg");
    : D2 q$ B1 C& S4 h; o% x
  2.     const socket = new WebSocket("ws://lm.com:9502");9 {- K, \+ q* j8 ~6 a" y
  3.     //% m7 J1 G7 L( A- b* ?% r0 m& H
  4.     socket.addEventListener('open',function(){
    ( b9 O* ]: i2 i# W
  5.      socket.send('Hello Server! Im live.html');
    * ~4 A' C0 N& S, W( M3 C  r
  6.     });: E4 |% ]1 ?- C  y9 Z9 @
  7.      // Listen for messages8 E( R3 a' Q) G) `' m
  8.     socket.addEventListener('message', function (event) {. R9 o$ c* O$ J
  9.         //图片地址
    # B( N; J1 l& n3 d: a! w7 {' z
  10.         img.src = event.data;) t( p; m* ^4 t9 U  n! Z
  11.     });
    + s* A% L3 o6 _
复制代码

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


. |: ]" @* x0 c# r& R3 Z
7 Q4 y! Q% m  a  V8 V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-7-19 17:39 , Processed in 0.086349 second(s), 19 queries .

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