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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  2 t4 I+ v) B1 C- r1 T6 Y5 M
  2. //创建socket服务2 K1 P! R' H+ C/ m' Y( ?
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    9 Z- n% a5 Y% {$ V
  4. //监听WebSocket连接打开事件5 _4 h/ K- S/ G1 _) h' E, V
  5. $ws->on('open', function ($ws, $request) {
    " p; j0 v# P& i6 T! W6 O. m3 f
  6.      var_dump($request->fd, $request->get, $request->server);
    * z8 v' l) O2 A, f
  7.      $ws->push($request->fd, "hello, welcome\n");+ r* m- D" o# X0 k9 [) m
  8. });0 I' Z, ?. Y: `% _) _3 X5 D
  9. & H9 J; C  m9 h# x. T
  10. //监听WebSocket消息事件
    ' x0 L6 j" Y( h( f' I
  11. $ws->on('message', function ($ws, $frame) {1 E0 O) _; x! C0 R7 _
  12.     //推送消息给所有用户
    ' z9 \! ?  S, R. M( M) q4 p
  13.     foreach($ws->connections as $fd){
    / h$ ^& v% O3 I" U( r  E7 y0 X
  14.         $ws->push($fd, $frame->data);
    & X3 \' @* k" v7 `# ^) t% \
  15.     }
    2 j. I8 i6 a. F
  16. });/ `. n" `; y) V2 t7 h  p5 k

  17. + w! ]8 _/ {1 a* V  w
  18. //监听WebSocket连接关闭事件
    + y/ h" n5 N8 V7 K* a$ Z
  19. $ws->on('close', function ($ws, $fd) {* b1 [2 G: f$ N+ F" T
  20.     echo "client-{$fd} is closed\n";
    % ^' A' q" T) i# T
  21. });
    & y7 w6 _4 Y  N" F6 f+ ~. ?7 N1 f. A
  22. //启动服务
    . [( Z* x/ j2 L2 t2 p3 c& x# F
  23. $ws->start();  x1 M3 l: G1 i7 h5 B

  24. 8 M3 T+ o+ G5 F2 E; f
复制代码

& L4 K: s% s8 _7 K- W/ @Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端& D8 F% j" @# j9 F7 G7 D

代码如下

  1. //连接服务器8 t* K6 z5 L- p1 g( u" b7 h
  2.     const socket = new WebSocket('ws://lm.com:9502');: C) S( R+ r5 B8 O  H5 U, p
  3.     //Connection opened, K; {6 F( I  c! K, z7 e
  4.     socket.addEventListener('open', function (event) {
    ( W  |# B: r  d+ L
  5.             //发送消息给服务器
    ) r$ k" F5 x" G
  6.         socket.send('Hello Server! im websockt');1 m& x* j5 u3 o; b4 O
  7.     });
    3 a# O- ]$ D2 f6 ^" c
  8.     // Listen for messages
    % L$ b+ b+ `0 F! \# J' z* F
  9.     socket.addEventListener('message', function (event) {
    4 l9 `: U& E% ^: `/ k6 I
  10.             //接收服务器返回信息
    6 Y7 M0 ]% t! v* w5 \4 r4 N
  11.         console.log('Message from server ', event.data);7 T( R( b$ x4 t6 g3 l" X2 {, m
  12.     });
    7 U2 b+ M" S5 p, g+ z& Z
  13. , |# e- h" T9 z+ W7 i0 v# T
复制代码
伪直播主播页面
/ Q6 Q4 C, F# l6 _0 S: ]

html

  1. <body>5 U1 i/ P; Y: A, j+ A. r
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>& U+ e( m4 H& O6 |) V1 X+ v
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">: ?/ s! \: l" {+ Y! |8 k
  4.         画布5 K( D+ I7 Z2 @; e
  5.     </canvas>
    8 ~% e& ~7 P, J1 Y5 ?5 G7 f1 }
  6.     <img src="" id="videoImage" width="350" height="700">& w( C( G+ x6 x6 h  [  F9 p' A
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>) u7 x- r# I. A6 Y8 J2 W
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    6 T% ~! k1 ?2 ^6 O7 |/ e
  9. </body>
    & ]) T- c( _0 S8 i) |, {3 L3 L$ F
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    + J; Z. h3 h# B8 Q* G$ w; N
  2.     var c = document.getElementById("myCanvas");
    $ I$ k$ M' `5 q" i( `$ y3 K3 Y
  3.     // var c = document.createElement("canvas");
    . s0 S  G( C* E& b5 m/ e- E
  4.     var img = document.getElementById("videoImage");" ~: E" ]* x6 a' i  U) L  y
  5.     ctx = c.getContext('2d');
    ! Q- l' A" p4 x0 m* o
  6.     var dataUrl;
    ; H# p/ j* h) f0 B1 a* q6 m5 F
  7.     const socket = new WebSocket('ws://xxxx.com:9502');+ r4 d4 ?/ Y+ E
  8.     //Connection opened
    0 T* h8 W/ j" j
  9.     socket.addEventListener('open', function (event) {- Q0 @) q1 N5 C& L% o. t' l9 y' F
  10.         // socket.send('Hello Server! im websockt');
    ; Z% M$ n: {6 q- g1 Z4 b
  11.     });0 h1 o  N( V' m( c5 J! O" z
  12.     // Listen for messages# o& c* C( x! h" S4 G; c0 J
  13.     socket.addEventListener('message', function (event) {
    ! l( E/ @, n; E8 F0 e
  14.         console.log('Message from server ', event.data);1 u- O8 [" D( U- K0 v: q
  15.         img.src = event.data;) X5 w) T# \1 F( P
  16.     });
    7 H  x( c# A6 ?( `1 J
  17. # m6 v/ _9 A. r+ f8 @, x
  18.     function playVideo() {0 G  q, u; ~8 x- j% w8 r0 n
  19.         ctx.drawImage(v, 0, 0, 350, 700);, {$ r3 ?, ^) D4 u6 v1 M
  20.         dataUrl = c.toDataURL("image/png");
    3 a! x0 k8 O1 ?
  21.         // img.src = dataUrl;
    2 X8 N( p8 ?4 N- r1 k( x: n
  22.         socket.send(dataUrl);
    . V  G, `4 a& P5 u% [6 l
  23.     }
    5 H* h& _$ ^( r0 g' e! j- h
  24.     var tick;
    5 q$ w1 M. y7 C: ~0 ?
  25.     function aphla() {
    + H. Z2 K  m, h8 k8 j/ T3 [
  26.         tick = setInterval(function () {+ I  x/ q# ]7 v0 Q( q
  27.             playVideo();
    6 t; |; O, c; A/ ~. Q- z: ]+ l
  28.         }, 1);
    7 k" ?8 H% K. g" m, Y# c* N
  29.     }* }0 |# j8 x" m* a. }
  30.     function vdStop() {, d7 A/ I$ M; d, F8 w1 Q" q
  31.         clearInterval(tick);* V8 L* @( n+ m8 |; k
  32.     }% c* N$ p4 T3 M% R4 a# H, `
复制代码
用户页面
1 O9 q: h9 Y+ G2 J" L* K- \

html

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

javascript

  1. var img = document.getElementById("liveImg");
    ! X9 w0 J+ q6 y4 {) ]
  2.     const socket = new WebSocket("ws://lm.com:9502");# k9 w( B3 U0 F! {1 t( R& F
  3.     //
    ' {9 A$ f$ {* T2 R0 S
  4.     socket.addEventListener('open',function(){
    / p  a+ F3 H2 p$ @9 t  C8 P' x, D
  5.      socket.send('Hello Server! Im live.html');
    " u4 P; ?; }$ x! S
  6.     });
    * G6 }$ i( u0 D$ ?7 z! `7 T
  7.      // Listen for messages
    2 b. ]! D5 b" ~; A' N9 r  A
  8.     socket.addEventListener('message', function (event) {5 \/ }' M  ?- b( D2 Z1 j
  9.         //图片地址
    1 o+ l3 h, D3 e  X$ d1 @
  10.         img.src = event.data;
    2 R3 L8 P; y) e4 u  c8 ?
  11.     });3 ~! ]) A6 `; S! y
复制代码

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

) w0 a/ a! r- g; Z* r) {8 p9 k
* i  j" p7 s& a3 R1 O. s" z; c6 j
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 20:52 , Processed in 0.051647 second(s), 20 queries .

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