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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  ' a: M/ w/ x) f5 s" J% X
  2. //创建socket服务& E# c+ Z6 y5 Y# W8 x/ K
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);" C+ y. ^0 X) c# r8 D. \6 }+ m  W2 x
  4. //监听WebSocket连接打开事件
    6 _3 q( Y# P# |
  5. $ws->on('open', function ($ws, $request) {, |& _: k* N  I! l: M
  6.      var_dump($request->fd, $request->get, $request->server);! g6 d" O) b# l5 R2 ^
  7.      $ws->push($request->fd, "hello, welcome\n");
    8 i: z; X+ d+ a6 `
  8. });1 f6 i4 F, l/ U5 Z" P' D, c6 P$ R: |$ A
  9. # n3 w; n: d' d/ A5 f
  10. //监听WebSocket消息事件- U; a6 q) Z/ R! {  _- }0 b4 r
  11. $ws->on('message', function ($ws, $frame) {9 m, L" n5 z9 D- x- T6 Z
  12.     //推送消息给所有用户8 K$ v' P6 f7 b& }
  13.     foreach($ws->connections as $fd){& T( x7 ]! G5 U3 \% C
  14.         $ws->push($fd, $frame->data);
    1 a2 x& y/ c$ f! Y0 [: g
  15.     }9 [* G4 ^' W8 Y9 r2 h- w
  16. });$ j3 H1 g  ?* I
  17. 6 T. E0 O$ Z. @- P/ s% s
  18. //监听WebSocket连接关闭事件
    0 H: D. o4 D+ A& I" Q; |. f
  19. $ws->on('close', function ($ws, $fd) {7 B5 B/ }) M, O" `' y/ O4 o
  20.     echo "client-{$fd} is closed\n";
    , `$ ^- C5 s# O
  21. });" A, I. S3 C6 |. X# u) m* D
  22. //启动服务
    5 }9 C; |9 h8 h. }
  23. $ws->start();
    & C1 w" u. V$ ^; C/ g# r

  24. 6 j: L# Y0 Y& j* N1 Z: a7 Z6 f/ g
复制代码

! I' Q( c1 N$ B* O. J( W3 x2 D. RWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端  _/ I2 z0 p$ ?

代码如下

  1. //连接服务器+ E, K' P$ W7 C# Q& B* J
  2.     const socket = new WebSocket('ws://lm.com:9502');
    8 z5 d; J: j- v+ e. p& U9 G
  3.     //Connection opened
    ; G. n% q& E5 I
  4.     socket.addEventListener('open', function (event) {  A' m) \. l- t4 }9 e) a% |  v) H) a
  5.             //发送消息给服务器6 E+ A( Q6 s1 A0 W
  6.         socket.send('Hello Server! im websockt');9 b6 q% H% t" w/ o  W+ c, ^
  7.     });
    - B) G4 v* \' D
  8.     // Listen for messages7 V" X' X4 q: f" A. b
  9.     socket.addEventListener('message', function (event) {$ N9 E/ ^3 [* M, c5 ?8 t! J; j
  10.             //接收服务器返回信息
    , n. l1 Q. R0 x; p4 k5 Z4 Z( b
  11.         console.log('Message from server ', event.data);) w& o* P% B  i; E; n7 S
  12.     });  _/ C1 G0 G( `! K, r
  13. 2 c; ~7 o+ ^; B( R
复制代码
伪直播主播页面( j" \4 c  U3 l1 D8 o3 s& {

html

  1. <body>: Y. U7 J* @- }
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>' u: R6 A0 H) b! r$ A
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    . @! H) ^& R! I9 E5 v3 Q
  4.         画布" g$ o# p& S: x1 N
  5.     </canvas>
    - \3 l/ n- D+ a9 p! N8 h% h- R
  6.     <img src="" id="videoImage" width="350" height="700">$ c! D, {' L) y2 o
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>; b# l6 s! S; y' f  K! w! s- I
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>0 M: e' \7 r/ u' S
  9. </body>% H& u/ }1 ~# ~3 M1 D$ f/ S
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    " l7 P  r7 h. ?  M! D
  2.     var c = document.getElementById("myCanvas");
    % N, Z" Z0 {2 q& e; @- W
  3.     // var c = document.createElement("canvas");
    2 e( k* G( G. _9 ~
  4.     var img = document.getElementById("videoImage");0 i5 j8 P9 I: q4 Z8 w6 |- G
  5.     ctx = c.getContext('2d');
    ! z, L' `& }8 _4 W
  6.     var dataUrl;! F$ A# e$ X$ h# O
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    ; }' A0 z/ g& {$ g/ F* |8 \* w; _
  8.     //Connection opened8 e& `- O# k, X- O" U2 P
  9.     socket.addEventListener('open', function (event) {
    - K5 G; E# [. u, `9 e, D. w0 q
  10.         // socket.send('Hello Server! im websockt');$ u% ^9 N$ w' |+ Z  C) i+ D
  11.     });/ x0 W; @$ i  D
  12.     // Listen for messages
    $ ?8 T! A( F! m* i% p# b
  13.     socket.addEventListener('message', function (event) {! D/ O9 Z* w( b# X& X7 P: C
  14.         console.log('Message from server ', event.data);& J6 F! `9 f$ ?3 w
  15.         img.src = event.data;5 B; _& E  _" ?- |$ d7 ?' C
  16.     });
    9 J5 Q0 D; y* c$ N( E0 b+ X; r4 X

  17. : J3 f. d; p; E$ k; t4 v
  18.     function playVideo() {
    " Q/ E) o5 y4 b) g2 s/ H9 @: d
  19.         ctx.drawImage(v, 0, 0, 350, 700);% t7 M9 }, I( }" I
  20.         dataUrl = c.toDataURL("image/png");( J" f6 z6 T2 u1 W; T
  21.         // img.src = dataUrl;
    . k' @. x( G& ?. g! u: I
  22.         socket.send(dataUrl);
    0 n. v" z, x1 U6 e# _" P
  23.     }/ n" r" p; B" q2 e$ @
  24.     var tick;! h$ @4 \9 M7 ^5 @) n) k' v" z
  25.     function aphla() {
    ) ]9 r0 m$ c) R6 i/ ~
  26.         tick = setInterval(function () {% ]$ b0 D3 g9 V# ^" G
  27.             playVideo();8 D, Q6 L3 Y2 j: w; `6 |
  28.         }, 1);
    , i) t1 ~; q0 H( [4 P2 C. g& i
  29.     }& k1 l1 {( ~5 A  A) s/ d3 B
  30.     function vdStop() {
    ( ~1 D% K- n8 S+ e% |
  31.         clearInterval(tick);
    8 j1 f8 J) D: c
  32.     }
    8 g; I4 L4 p! l; t, `
复制代码
用户页面5 I7 q/ t7 S% {

html

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

javascript

  1. var img = document.getElementById("liveImg");- W5 P3 c- {- C
  2.     const socket = new WebSocket("ws://lm.com:9502");
    ' Z3 v% T1 X6 O" U# X! T% V* i, B
  3.     //, q& p  Q" v0 P7 M5 @
  4.     socket.addEventListener('open',function(){0 i' o5 G  k; a2 C& L
  5.      socket.send('Hello Server! Im live.html');) o" L( k" G. ^' U" n
  6.     });
    & O: `6 L; N  l8 G
  7.      // Listen for messages
      W8 w1 V. X3 l9 ^' P
  8.     socket.addEventListener('message', function (event) {
    + ^9 R4 y7 q1 @4 `& B8 D9 r
  9.         //图片地址
    # C. N! {- ~! X* Y% e9 f* e
  10.         img.src = event.data;
    9 u: O2 h' X* H+ K' p0 z
  11.     });
    7 ^$ U' K0 W' X1 G' r) f
复制代码

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


( B# E. n$ x7 V5 N2 m% h& ~. P5 k% N" a) _1 X
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 08:26 , Processed in 0.113040 second(s), 19 queries .

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