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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  , P9 ?& @0 p  Y) [5 f0 N. V
  2. //创建socket服务
    . G$ w6 U; s+ `. k1 f
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    4 c% N4 Q- g/ M8 s$ d, L) V
  4. //监听WebSocket连接打开事件
    # R8 I& W2 z3 e& h4 v
  5. $ws->on('open', function ($ws, $request) {
    5 |8 [3 t. o. d9 I2 s. N6 S
  6.      var_dump($request->fd, $request->get, $request->server);* o! H* N* f  G/ ^2 x5 @1 f
  7.      $ws->push($request->fd, "hello, welcome\n");; n. U+ k; i2 g' e
  8. });) Y& i7 r- `: b: F

  9. 3 B3 `0 u7 T6 I; \% t/ O' y( w
  10. //监听WebSocket消息事件; B: m& W% \: e6 g5 k# j% m
  11. $ws->on('message', function ($ws, $frame) {. ]+ m6 I7 }/ ~( I/ j, q0 e  v) R5 a
  12.     //推送消息给所有用户
    3 h, ~6 f( q" W- m) d2 h
  13.     foreach($ws->connections as $fd){
    3 J9 u3 x7 }$ B8 F
  14.         $ws->push($fd, $frame->data);
    " G& n& y1 A6 ]& l" _
  15.     }
    + J# z/ P/ F" T; f* ^3 l
  16. });5 C/ g; K' J) ^( R2 r' b: c+ i
  17. & a6 i7 [0 P4 z1 p- ?+ A
  18. //监听WebSocket连接关闭事件1 M/ c- F7 i+ U2 F
  19. $ws->on('close', function ($ws, $fd) {
    4 w9 M* C3 ^& {. A9 k
  20.     echo "client-{$fd} is closed\n";
    0 R' b3 V$ Q) R/ }' J% l0 @( o
  21. });
    4 |- Y  X7 D9 \4 q' q  c
  22. //启动服务" @5 \1 A. T* L, F" ~2 N* m
  23. $ws->start();
    ; H2 D' ^: Z: c7 }, {
  24. / o2 d# r# o# T6 Q' H7 E+ e& K
复制代码
0 @  H8 H) @) y. U3 J0 I  d; d$ D
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
1 Q+ \+ N$ }3 i' O

代码如下

  1. //连接服务器
    ! k7 T, a  T% G2 `' W; x! L
  2.     const socket = new WebSocket('ws://lm.com:9502');
    ( |7 h. |: W3 {9 N6 z+ P
  3.     //Connection opened. P6 Z2 Q5 F4 h' x! ~* L# q- G
  4.     socket.addEventListener('open', function (event) {
    , V8 c# x. H; M- S+ k6 M
  5.             //发送消息给服务器4 x% P: R6 x: L4 V( }  E
  6.         socket.send('Hello Server! im websockt');
    # m6 [( m" U0 h/ S4 l9 F' Y
  7.     });
    9 T" [9 X4 p2 `; o. K% l$ |: T( A
  8.     // Listen for messages
    6 P% K2 C) H8 g9 [3 @8 a! j4 B
  9.     socket.addEventListener('message', function (event) {
    0 e* ^# Z* [3 ]) I; ~
  10.             //接收服务器返回信息) D2 a; C/ C/ m% n( C
  11.         console.log('Message from server ', event.data);1 n  k9 {$ m; Z2 T) @1 {; t/ ]' V4 ?
  12.     });
    : X8 k3 L. D) X. x

  13. 2 s4 g3 [/ g% C" e7 }
复制代码
伪直播主播页面
. X! I7 I+ T, ^" n' P

html

  1. <body>
    $ `# E# ~4 a1 |3 a0 ?  A
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    1 E" e* p( T! r' r0 h4 k: v
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    9 \/ _! {7 p) ~% H
  4.         画布8 I/ h' I2 a' L3 k5 s
  5.     </canvas>
    " I: u7 [4 U& r% X
  6.     <img src="" id="videoImage" width="350" height="700">0 ~$ y7 F/ q+ A' [- A
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    4 [* G3 b. z+ ^: G
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    - `" q" S/ Q2 {% C& h! e
  9. </body>: c- E4 @+ C- {" D$ K# j+ j
复制代码

javascript

  1.     var v = document.getElementById("myVideo");4 f7 B! J6 [0 S" _& F8 h6 {0 f
  2.     var c = document.getElementById("myCanvas");
    & K/ I4 l' H; S6 f# y$ w% _3 m2 B
  3.     // var c = document.createElement("canvas");* e7 X* ~) N  z7 r+ v( ~
  4.     var img = document.getElementById("videoImage");7 p5 f5 j& `. w! d3 y
  5.     ctx = c.getContext('2d');8 ~* D1 t' Q  |- E
  6.     var dataUrl;
    - w& m% \4 g; }! f
  7.     const socket = new WebSocket('ws://xxxx.com:9502');9 r( R! O  V7 r& ^9 @
  8.     //Connection opened; P* }! Z! [* O  ~  I+ E9 Z
  9.     socket.addEventListener('open', function (event) {  p  |6 [+ W* A
  10.         // socket.send('Hello Server! im websockt');. {/ X; w7 i! {$ K8 I' c
  11.     });
    % p! J# k/ V0 \/ X( w
  12.     // Listen for messages$ C. V# n- e! _# b) Y  I9 J4 ~
  13.     socket.addEventListener('message', function (event) {
    : w6 [9 C# U' a* J" r7 h+ A7 K4 v" p6 S
  14.         console.log('Message from server ', event.data);
    # t5 t" }" G' n! ^/ o+ h% D
  15.         img.src = event.data;# C% k  F5 W0 \$ v4 @! Z3 ?
  16.     });
    ! k, q0 _' S# }% [" F! {' l
  17. . G' f- X; ^# N- }7 i
  18.     function playVideo() {
    # t4 K' t7 l# d! |" R1 V
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    8 d9 _1 v; x% o9 @  @% g
  20.         dataUrl = c.toDataURL("image/png");
    7 B( E% [2 k1 Y6 I8 O5 S8 Q' [% W
  21.         // img.src = dataUrl;
    4 t6 q' w3 X" C- W6 \4 {4 |- D
  22.         socket.send(dataUrl);9 ~% {$ t' n/ k  V2 }; T/ @
  23.     }
      C" f- y! x. I, U. O6 r2 s
  24.     var tick;
    7 Y; r% S* @$ W8 i5 g( }6 L) v' f
  25.     function aphla() {5 R; w" `) [5 p, h- F% B% f$ m6 L
  26.         tick = setInterval(function () {0 R5 g: O* Z: Z6 N
  27.             playVideo();
    # f: V+ J+ n3 c+ {3 P
  28.         }, 1);7 \. G7 i% y" m. a
  29.     }
      s7 i! u# Q" m- a8 i* y* D
  30.     function vdStop() {
    9 T- _' N5 e" b; X
  31.         clearInterval(tick);6 u# G/ }4 e* O) d% M* Q) U9 I
  32.     }
    # L# T" D! t2 V( p9 N! ~9 \/ ]
复制代码
用户页面
, a% t  A3 O2 p

html

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

javascript

  1. var img = document.getElementById("liveImg");
    7 A9 C  U7 `& Y& n; m. C
  2.     const socket = new WebSocket("ws://lm.com:9502");8 e- L" q! j( R( K: J7 R9 c8 J  a
  3.     //
    1 [: ?7 Z7 e8 ?9 {& V: m/ Y% W
  4.     socket.addEventListener('open',function(){* }# B/ P# E0 d! L+ x! T3 ]
  5.      socket.send('Hello Server! Im live.html');) Q/ F7 n/ v/ P# ?
  6.     });% n% _% }- m$ @- m* E+ }( G7 |
  7.      // Listen for messages6 z: K( e2 \/ d1 j% t. x. p& r0 g
  8.     socket.addEventListener('message', function (event) {
    4 i- u: Z* L8 P" M: Z+ ^& z
  9.         //图片地址
    1 `+ S0 o( J, q, E# X
  10.         img.src = event.data;) p& n4 p3 a4 X8 t. z
  11.     });
    6 X# r- [2 c3 E; G8 C7 M- l
复制代码

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


$ \1 S$ |+ X. \' D: G/ ?# C. G
( `. h5 q- l9 |/ U. q6 u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-18 22:04 , Processed in 0.104618 second(s), 19 queries .

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