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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  , S; w3 R: v4 J
  2. //创建socket服务1 P& Z9 a0 d& n3 ?; |" r/ M
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    ) T4 ~8 ?* l. r5 I& P
  4. //监听WebSocket连接打开事件
    0 f7 n: a) Z4 x9 s$ p7 z9 B
  5. $ws->on('open', function ($ws, $request) {  ~9 ^2 P2 ?% A  `; ~9 ~
  6.      var_dump($request->fd, $request->get, $request->server);
    $ j! {& k3 S. f" Q4 d5 j" O
  7.      $ws->push($request->fd, "hello, welcome\n");( g' W! E8 o9 O- L* h, Y% Q
  8. });0 B* K" T% W! G0 U, Y

  9. 6 N* K& ]. j+ ]% r% P% d; W* z% \" h
  10. //监听WebSocket消息事件
    $ `$ ^* L& i9 n  j  q( o2 m" R
  11. $ws->on('message', function ($ws, $frame) {( b( q% L; y% R/ x
  12.     //推送消息给所有用户4 [. W5 h0 v) v
  13.     foreach($ws->connections as $fd){9 Q! H, |1 s" h# W7 W
  14.         $ws->push($fd, $frame->data);
    / B2 @2 R5 G1 W
  15.     }0 n% C5 Z5 E$ K
  16. });
    * b5 D$ K1 H0 W6 l' H: w/ R$ v* n& V

  17. , y! S; }6 w; g7 _6 g) i& J
  18. //监听WebSocket连接关闭事件
    ) u8 ~: N/ |: M
  19. $ws->on('close', function ($ws, $fd) {" ?$ l6 |+ A% p! p. C# H' x
  20.     echo "client-{$fd} is closed\n";
    2 P& U9 ^7 A3 S9 t
  21. });; I5 o- O$ _& ?; C' T
  22. //启动服务/ b' d- ^  N$ b
  23. $ws->start();. x+ L. F& e! s) f7 w* g* M1 e
  24. 0 R; X$ U0 I* U! D- E2 k
复制代码
0 b4 F! A# |% L+ w
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端. D/ }% U0 Z2 W* M

代码如下

  1. //连接服务器# A% `$ w/ Q. L0 B
  2.     const socket = new WebSocket('ws://lm.com:9502');- Q7 y7 B) R7 x5 C$ G) C5 Z& O9 z( t
  3.     //Connection opened# ^0 E) V$ ^4 j4 @& @
  4.     socket.addEventListener('open', function (event) {& j; x; E5 o* h. S* H$ O
  5.             //发送消息给服务器6 S* L  ?  N& X: {+ K
  6.         socket.send('Hello Server! im websockt');/ m. b8 @- o& ^) i1 s. b
  7.     });6 b- A2 L! S9 N8 L" Y6 l. B
  8.     // Listen for messages6 y5 p' m+ c2 i3 W0 n1 J, F
  9.     socket.addEventListener('message', function (event) {5 c1 }. I, u4 Q0 y* d
  10.             //接收服务器返回信息# E6 _1 R( }8 T, L5 o& a
  11.         console.log('Message from server ', event.data);
    . m5 b; R  E% C, q
  12.     });% w! T" l! R1 _- V

  13. ! n$ ?$ t+ p) b4 i* W5 _
复制代码
伪直播主播页面" j& w4 p$ S+ s9 g8 V2 Q5 R6 y. h

html

  1. <body>6 h+ B, r2 b" V9 o; G
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>( T+ J) r' ~* }8 z* X( g3 ]/ C; U
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    ; \2 L# h' L  X! V4 b0 r8 F+ L, ~4 T
  4.         画布
    ! @+ E* Z! y/ J# O: i
  5.     </canvas>, m" j: F9 E. w! K8 H- o' W
  6.     <img src="" id="videoImage" width="350" height="700">7 c& v3 N* d9 b6 W! |* r
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    . K" _/ _4 l4 z* y4 \  j
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>6 Z- y# Z* [  H" t8 Z
  9. </body>5 I9 E7 y" u( c' [9 g" u
复制代码

javascript

  1.     var v = document.getElementById("myVideo");- L0 k7 `7 E; h! e9 L2 d# |
  2.     var c = document.getElementById("myCanvas");
    : j$ b: K  w  U* \9 N0 b& `4 z
  3.     // var c = document.createElement("canvas");- M% B) T2 x/ t4 }. a: P
  4.     var img = document.getElementById("videoImage");
    0 [' X( Y  C7 L6 M8 j. w
  5.     ctx = c.getContext('2d');
    & u; b: I" K6 w6 ~3 J) U
  6.     var dataUrl;
    & ^$ u- t& ~+ ?* S7 H# }
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    - s, Z' A, D6 z1 {1 X2 m. k  ?7 s
  8.     //Connection opened
    ( J1 v/ h& P: R+ q
  9.     socket.addEventListener('open', function (event) {" f. `' m- H5 a
  10.         // socket.send('Hello Server! im websockt');; E0 A& }; x5 ^5 N4 n
  11.     });! ]  f: g% E2 R
  12.     // Listen for messages3 A, K1 y8 _( C' a
  13.     socket.addEventListener('message', function (event) {5 S. p8 }; N" s" s& F" S
  14.         console.log('Message from server ', event.data);+ w8 h2 d2 R" ?# o% Q& E5 A( H
  15.         img.src = event.data;
    " Q5 k8 ?# L9 ^' T/ J
  16.     });. ~# p7 `0 q& l" x

  17. 6 a5 L, d3 @( f3 e+ ]! Q) h
  18.     function playVideo() {
    / \, c% V0 g4 U/ a" S
  19.         ctx.drawImage(v, 0, 0, 350, 700);- S- p( d+ p- M2 z! k0 ^0 g' x
  20.         dataUrl = c.toDataURL("image/png");7 F4 d3 W2 L7 ?  X! J
  21.         // img.src = dataUrl;0 X* j4 v/ s) ]2 a8 J' w+ k
  22.         socket.send(dataUrl);
    9 r+ w3 S* B! r! w7 \1 ^
  23.     }
    ' w+ K9 f. N5 Z, l; l  c+ k+ v( K! i( \
  24.     var tick;
    ; s9 j" g6 h) n# n4 E
  25.     function aphla() {
    2 f6 [) z3 A6 k+ I; t; J
  26.         tick = setInterval(function () {1 F2 w: ~/ \6 E9 E6 i
  27.             playVideo();9 [2 l# s  L& q8 K2 O2 O# y' U
  28.         }, 1);5 ^0 `: _- y9 Y5 Y2 B7 J
  29.     }7 v0 K1 V( q/ S% _% _7 q7 }# f
  30.     function vdStop() {, K$ c! g* ~- W! q1 {1 P
  31.         clearInterval(tick);
    6 \% c+ A, |* I0 s
  32.     }
    + l6 E; ~; g, r7 F
复制代码
用户页面4 s. A* z) [. h4 n

html

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

javascript

  1. var img = document.getElementById("liveImg");! g# h9 E1 t% X9 Q
  2.     const socket = new WebSocket("ws://lm.com:9502");
    ! |% p1 v0 w% @4 s3 i
  3.     //+ _5 G1 x4 I' S8 r+ |. X" n4 e
  4.     socket.addEventListener('open',function(){& }9 H+ C+ r6 U; u& E" ]( d
  5.      socket.send('Hello Server! Im live.html');
    ) Y0 q) a- {" s8 v
  6.     });
    8 y/ \; `; R& c6 V) H. u' W. S
  7.      // Listen for messages9 ~8 @' V5 s* \
  8.     socket.addEventListener('message', function (event) {
    7 j$ U8 K: h6 f3 ?$ S( E
  9.         //图片地址% l+ s: E( C8 s, I% I% o' V
  10.         img.src = event.data;
    / N( ], @! p5 W( A
  11.     });6 X8 D* T+ K' x4 i
复制代码

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

$ n* l( ~/ `0 p" K- P2 z& x. G+ L; _' T7 [
7 `7 ^- {8 q- u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-17 16:07 , Processed in 0.129328 second(s), 19 queries .

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