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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  : d% Y1 N( k* b! O1 L2 R/ x( S* m
  2. //创建socket服务
    7 m. X0 W3 V/ w" ^% L
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    + Z: l5 v- V# r. {9 w+ ]9 O: M# _
  4. //监听WebSocket连接打开事件
    % f/ j/ _/ H6 }1 \7 \3 c
  5. $ws->on('open', function ($ws, $request) {
    8 _5 c. ~8 V* H3 L( W
  6.      var_dump($request->fd, $request->get, $request->server);: Z$ r) h8 L! M  s" ?+ [8 C+ E
  7.      $ws->push($request->fd, "hello, welcome\n");
    1 F: W) _) Y# k0 s4 u# @; p( S4 x
  8. });
    3 S0 g& R- z, }) [  z

  9. 6 a; G( L6 x5 H( ~& g3 c
  10. //监听WebSocket消息事件
    + g3 i% p- j% v. S6 z/ t
  11. $ws->on('message', function ($ws, $frame) {
    / u4 l0 w% z, b) }9 R
  12.     //推送消息给所有用户" T; T7 t0 a% ~3 t
  13.     foreach($ws->connections as $fd){
      @& [$ @5 I7 _" T8 Y3 c
  14.         $ws->push($fd, $frame->data);
    4 W" i; `) P9 C6 B
  15.     }
    , r) ^3 w3 Q( @  }5 E  q# s! s
  16. });# o- J& Q0 K' N2 i  n
  17. ! z9 q0 G, L5 [+ h. W7 A; T
  18. //监听WebSocket连接关闭事件! r% Z7 w& K" T
  19. $ws->on('close', function ($ws, $fd) {( F: I4 w, b/ {# {  K
  20.     echo "client-{$fd} is closed\n";5 o$ Q7 n9 M4 q
  21. });; M" Q) L3 {! J$ f+ I  n( k
  22. //启动服务
    + }3 t8 k1 K# `2 Q9 u0 Y) ^
  23. $ws->start();! Y# y" J6 r6 T' g. X# R5 I

  24. 6 J) M) a5 N& h& J" o
复制代码

' \* z0 Z( V3 ^! X! |: Q3 n! ?9 mWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端4 U% W/ G, O' s$ G8 A6 m/ f

代码如下

  1. //连接服务器
      ?/ D9 o* p! |5 c! {, ~' a
  2.     const socket = new WebSocket('ws://lm.com:9502');' O; ?9 W4 }6 ]3 A' ^: U, Y
  3.     //Connection opened3 i  F) G$ Z4 R" q3 a. d1 H  F& m
  4.     socket.addEventListener('open', function (event) {  j% ]7 ?- Y3 n2 z% _1 Q
  5.             //发送消息给服务器3 \, u  J* C3 t' S
  6.         socket.send('Hello Server! im websockt');
    ; f" x" m$ w$ G, a. A
  7.     });: t9 {% ]; Q- Q" G3 p$ \% e
  8.     // Listen for messages) |! h0 G7 V' B0 ?" `6 v
  9.     socket.addEventListener('message', function (event) {
    . \/ ~) |5 V% A8 k! U5 |
  10.             //接收服务器返回信息
      D8 V( Q# L2 T. ]. ~
  11.         console.log('Message from server ', event.data);
    - b9 p1 }: l# N* [* Z0 _: C. g$ x1 {
  12.     });. H- y: `9 F) b2 W
  13. 6 Y/ ]! F5 k* a' u& n
复制代码
伪直播主播页面
" ~- L# t# g  u1 x2 b

html

  1. <body>
      Q$ @5 V4 N" K! q& M+ [
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>; k# v5 s' E- ~$ Z( D8 K! S
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    2 c1 r/ y( u* K
  4.         画布* I/ W* e- ]' T! B1 q
  5.     </canvas>
    ! X  o  L8 h$ {
  6.     <img src="" id="videoImage" width="350" height="700">
    / s! I5 S% @% L% f" _4 R5 W
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    & `' K/ |8 M; Z) W' Q: d# n, o
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    3 ^2 m. E) d3 ~
  9. </body>8 h5 o3 g( ~( G5 |
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    8 q/ m/ Q  D- S
  2.     var c = document.getElementById("myCanvas");( l9 z  x, G6 V" J$ y9 H3 v% Z
  3.     // var c = document.createElement("canvas");
    2 I% S! v5 r2 z. \7 R
  4.     var img = document.getElementById("videoImage");+ b3 R0 \" o+ [( R
  5.     ctx = c.getContext('2d');% p  K$ q: q" ^- S, F: \
  6.     var dataUrl;
    ) k) K0 T* ^0 a
  7.     const socket = new WebSocket('ws://xxxx.com:9502');7 O: V) G0 u9 S. i" c* @! k+ c9 D
  8.     //Connection opened% |9 J6 }  R: j  M0 c
  9.     socket.addEventListener('open', function (event) {& F! a5 Q- e, W, O5 m: K
  10.         // socket.send('Hello Server! im websockt');
    * M' M4 ~6 ~0 @* Q2 c$ r, t# \
  11.     });
    0 @$ D. E* i2 P3 g- T8 N" c8 ^3 d
  12.     // Listen for messages
    / U1 e' ~- g5 T% t& T* Q7 |
  13.     socket.addEventListener('message', function (event) {
    5 y' K: s) F5 m5 h, L
  14.         console.log('Message from server ', event.data);
    , I5 ~7 ^; o  U5 b2 o
  15.         img.src = event.data;' H- Z7 i% ^4 [/ M3 B% E% w' t
  16.     });
    ; _2 _' ~; s" h4 p  T# W/ {5 G$ Y
  17. 5 O% J+ n/ s5 S. z
  18.     function playVideo() {
    1 p+ b0 E# a' R3 p$ h
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    + |1 C+ G8 w3 J7 [1 l5 W/ G9 i, Q
  20.         dataUrl = c.toDataURL("image/png");
    # @( l% H0 J$ h, B. n+ ]
  21.         // img.src = dataUrl;& {" J  y5 R2 \" N4 e7 V
  22.         socket.send(dataUrl);
    $ z. m* ^: G+ |0 X) s
  23.     }
    * X* `, ?, x( X
  24.     var tick;
    ) p& M' `: j. H
  25.     function aphla() {
    : a1 \' P0 m- E
  26.         tick = setInterval(function () {
    9 }4 j8 c' j+ y* X& K, ?8 Y/ J  G9 t
  27.             playVideo();/ f; P7 I! \# i5 Q- C
  28.         }, 1);4 I7 ?; X  H" i7 k
  29.     }! T- c) X! \( t7 Z
  30.     function vdStop() {
    ( w/ r. ]  K4 s2 N! x* N) i
  31.         clearInterval(tick);
    0 m6 H: z6 G3 r6 o. |+ q
  32.     }
    4 h& W/ w9 u2 e8 r0 k( w! Q$ C) b
复制代码
用户页面* y( |& {7 J" V  U- ]; u7 M

html

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

javascript

  1. var img = document.getElementById("liveImg");6 |- X" W) g2 e/ U. R. `0 q& a
  2.     const socket = new WebSocket("ws://lm.com:9502");
    $ O$ S. g- P8 B+ L- Y  ?
  3.     //
    : D9 ?9 ?9 s5 C7 J& g+ }
  4.     socket.addEventListener('open',function(){! y- b1 f3 m5 I: r) n4 B
  5.      socket.send('Hello Server! Im live.html');5 T( {% [  B1 Q4 i
  6.     });
    + ^3 m2 e  P' }- B
  7.      // Listen for messages
    7 Q" f+ C+ V* L& X) n
  8.     socket.addEventListener('message', function (event) {# _- G2 ?1 f7 d4 Q6 L1 H. N% }
  9.         //图片地址0 T5 q# p/ Y0 I
  10.         img.src = event.data;
    & X8 g2 B: _/ O' O
  11.     });
    ; o. b' Q( {( d1 h- O" w
复制代码

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


( R5 n- Q8 `; {" ]
0 G+ {4 R1 I( L: B* y0 U  O9 p  |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 11:52 , Processed in 0.105891 second(s), 19 queries .

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