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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  ' V  b8 \) ]7 j
  2. //创建socket服务2 [( `/ o( M7 u! O
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);+ q* Q/ q% t$ i9 Q9 C7 N
  4. //监听WebSocket连接打开事件% C/ K3 a( p, F! L# Z( Z: b
  5. $ws->on('open', function ($ws, $request) {
    ) \/ B5 c) N; Q7 N& o9 C; l6 b
  6.      var_dump($request->fd, $request->get, $request->server);
    1 g* V8 _2 q' n
  7.      $ws->push($request->fd, "hello, welcome\n");
    5 L: g' o6 ?( v; z' i& n' E
  8. });
    3 o6 _! o$ `1 w# \8 C
  9. ' ]$ `/ q0 k' B  W
  10. //监听WebSocket消息事件( l9 V3 t( a: G& Q
  11. $ws->on('message', function ($ws, $frame) {
      Y: E$ j8 B8 Q! x3 A$ ]
  12.     //推送消息给所有用户
    , V3 h, r! E+ r3 \3 y$ }  S" k
  13.     foreach($ws->connections as $fd){, W5 E$ e9 ?, }" p) {% z2 \
  14.         $ws->push($fd, $frame->data);
    ! O0 j, X* O' W7 [' e( v6 b8 D# M
  15.     }3 U: d, T+ ~; J! ~% z3 f4 n. q( B
  16. });* Z% E5 P' S9 A+ ?) r% k
  17. $ `7 p* w+ r& f' Z
  18. //监听WebSocket连接关闭事件
    % q  [$ s* }& g- J' d8 ]- T1 e
  19. $ws->on('close', function ($ws, $fd) {# D) i0 l" N) ~3 Y" Q2 p; E
  20.     echo "client-{$fd} is closed\n";  q* W6 m: P  Z# [, g' K
  21. });
    ' S" j# P5 |3 B( B: Z: G6 }( k& H
  22. //启动服务! I2 e' t! u! R$ w) R% X8 ~1 ~9 S
  23. $ws->start();
    ) ~; C$ b6 R' y9 F  s

  24. ; g- h$ A) r6 Z# A
复制代码

: ]: z5 b7 E/ {& IWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端2 ^  P0 ^% D# O8 B7 i' u6 q

代码如下

  1. //连接服务器' x# @$ X! ~) i; p
  2.     const socket = new WebSocket('ws://lm.com:9502');9 [2 i* {8 Q/ C  Q( i% f
  3.     //Connection opened
    7 K  b4 Z* J+ G  h- W9 e
  4.     socket.addEventListener('open', function (event) {
    ' E- Y9 @+ K6 F2 L. p* ?6 N
  5.             //发送消息给服务器' G# {! E, l( ]! l/ r+ Z  }
  6.         socket.send('Hello Server! im websockt');
    & T! ]' h6 w' P4 ?0 k
  7.     });
    - @- M' N% @+ i2 A2 m
  8.     // Listen for messages
    7 [" O$ l- n  c+ z
  9.     socket.addEventListener('message', function (event) {
    7 h% a( A) f, [- w/ P2 H' ]
  10.             //接收服务器返回信息
    0 Y7 r7 ?8 ^  P7 X6 f( }$ h
  11.         console.log('Message from server ', event.data);& o- h8 ]  d* F$ ]  |- Q9 ~/ [! o
  12.     });+ q* F: G% I2 I+ [/ b# A# F% A: j

  13. / D6 w- J/ o/ F+ |9 a' v
复制代码
伪直播主播页面  [3 h& ]: p! P. C

html

  1. <body>! [9 S9 G6 Q" z  c: n
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>1 r* b- Z  c2 e9 M
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;"># l; W- n, P( y" n6 I# `' A
  4.         画布
    / E" o4 r7 X& `0 u4 _" ]
  5.     </canvas>
    ' R  v  m2 V1 y! ^& I$ u& p
  6.     <img src="" id="videoImage" width="350" height="700">: f. w. Q, m1 S* E: @
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    0 W9 q  k- `0 R, f2 @" C
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>4 K1 i, E; k' S) }
  9. </body>
    $ h/ T2 A- p. |  w2 x. P
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    6 Y5 ~2 Q  q( Q& v7 C% d
  2.     var c = document.getElementById("myCanvas");" ~! Q+ f8 o8 H1 p: d0 Z
  3.     // var c = document.createElement("canvas");1 b( D! \' x3 r: _* s+ L3 T
  4.     var img = document.getElementById("videoImage");
    ) J+ S$ v  R3 r+ ~9 \
  5.     ctx = c.getContext('2d');2 @' _0 D" {/ L0 k6 R
  6.     var dataUrl;, W0 _: d. U/ X
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    1 S$ K# k6 T: g% d
  8.     //Connection opened
    ' |3 P$ p' H. g7 z3 |6 o
  9.     socket.addEventListener('open', function (event) {
    ' P0 ]% J9 \0 Z& W* O
  10.         // socket.send('Hello Server! im websockt');
    5 d8 O, |& W* M) M! ?- ~/ X" i8 U, s
  11.     });: ~. Y1 ^) M9 L+ p
  12.     // Listen for messages
    $ F6 q& r6 H4 ^% t
  13.     socket.addEventListener('message', function (event) {& u$ \: d& H& ~7 P
  14.         console.log('Message from server ', event.data);  d# h& T4 n% Z4 u( E. k4 G, a% |: w
  15.         img.src = event.data;
    5 B6 Z  Z9 I" I8 H" \+ @
  16.     });; |1 e; k1 v3 G" V- J' `

  17. % K, ?2 A0 s6 @0 H% {. y
  18.     function playVideo() {+ L% v$ V& Y1 t  N7 \% C
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    " s% ]1 y* L: z
  20.         dataUrl = c.toDataURL("image/png");' x  U$ x* r  j/ ?" X  p! }
  21.         // img.src = dataUrl;
    5 B1 F  _- P' C1 o2 w9 I
  22.         socket.send(dataUrl);
    # p2 w4 r5 r* b8 Z
  23.     }0 B6 n* V. F+ w4 G9 k
  24.     var tick;; S; K& C- J  }5 H- I+ t3 L
  25.     function aphla() {! B5 @) p0 g( C  h! \* a9 p: z
  26.         tick = setInterval(function () {
    # W7 A- L+ @- E
  27.             playVideo();
    . _) B3 I& ~6 T% H
  28.         }, 1);8 R  B) Z# @+ E/ k0 H
  29.     }  h  f  b9 e) M# Z2 F8 O9 h! X( v
  30.     function vdStop() {
      [0 X3 a; |& Q2 J; ^
  31.         clearInterval(tick);
    # ^' ^0 e5 w/ ]1 Z
  32.     }+ b- C. N7 C) M! }6 C2 o
复制代码
用户页面7 T7 @- N" J* U) ^! n) n5 C

html

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

javascript

  1. var img = document.getElementById("liveImg");
    . `8 w, [. I5 q: M6 z  A3 S
  2.     const socket = new WebSocket("ws://lm.com:9502");
      ]+ R6 m1 ~& M3 @
  3.     //
    / m) Y; d/ T  Z0 |1 b; @' }
  4.     socket.addEventListener('open',function(){
    9 d/ b: x( C# B* G( l5 A" ~
  5.      socket.send('Hello Server! Im live.html');
      g1 N0 F( v' \' K
  6.     });/ _+ R  w0 u* q! H) |
  7.      // Listen for messages% a; `( h8 m, M  p+ O* s
  8.     socket.addEventListener('message', function (event) {  f0 Z1 C3 U) j/ {  s
  9.         //图片地址: S) I4 ^4 {6 T0 ~1 `! k
  10.         img.src = event.data;
    1 n/ Z9 A) L/ Y
  11.     });" q1 d( Z. I/ s& Y8 O- b  f
复制代码

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


6 s3 T$ u; X1 |+ S8 c& X) J
  q1 T! Y5 y; k: C# V; v) U% C
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-6-26 08:06 , Processed in 0.117506 second(s), 21 queries .

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