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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    5 v' T# H* t& x6 w/ J( j
  2. //创建socket服务
    7 X- r$ R% s7 o$ a# f
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    7 b) x/ `1 P; f
  4. //监听WebSocket连接打开事件. D7 _  m  b. t( v
  5. $ws->on('open', function ($ws, $request) {( Q; c# B: x8 F3 [) t7 N
  6.      var_dump($request->fd, $request->get, $request->server);7 ^5 }5 V! q  H! }+ `8 p9 I
  7.      $ws->push($request->fd, "hello, welcome\n");( r6 ~5 I8 K- v, @9 o3 B7 u
  8. });7 ]# \+ s7 O& m
  9. + G" P- @* @0 n8 e' S8 e% c2 q6 l% e
  10. //监听WebSocket消息事件1 S6 S% }9 U0 x4 \8 T; j0 T4 F0 H
  11. $ws->on('message', function ($ws, $frame) {
    % W5 i, S; ~% K! V
  12.     //推送消息给所有用户
    ! x) c0 k" B: y2 q. m! g1 c* s8 k
  13.     foreach($ws->connections as $fd){
    8 ]- j6 a- m0 l2 Z  [) n2 h9 x
  14.         $ws->push($fd, $frame->data);
    4 E% U- Z7 p! @0 D9 b" R2 h! O
  15.     }
    2 R3 u. T5 o; l" F* J
  16. });  N. \, b; B; C! G1 }

  17. ' }. }% `6 U/ G
  18. //监听WebSocket连接关闭事件9 }) \" _3 N% ?# Z
  19. $ws->on('close', function ($ws, $fd) {" E6 J* y/ J  p3 |- }) y
  20.     echo "client-{$fd} is closed\n";+ d# l2 \7 k  k/ V: E. ^* E9 B
  21. });
    $ U  m: `, H' a% B0 y
  22. //启动服务
    ; Z/ y. P% b7 g3 @" f& V5 d3 t
  23. $ws->start();
    ) r; Y8 a: R, m1 g+ E1 s- {- {

  24. 1 A4 R; ^2 _# Y$ D# H: r
复制代码

( ^0 [8 O  J& A' \Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端+ L( W' i3 d# v6 o  G6 T

代码如下

  1. //连接服务器
    ( Q( @$ v. r  w% G/ |4 P5 _5 }
  2.     const socket = new WebSocket('ws://lm.com:9502');! }; O6 ?4 S5 x' `2 `
  3.     //Connection opened. P$ w2 }1 D3 U. W& }& t8 d8 g
  4.     socket.addEventListener('open', function (event) {2 r7 p$ Y" I" C# m% c
  5.             //发送消息给服务器/ V0 w+ Y! H" q3 t/ c6 G  n
  6.         socket.send('Hello Server! im websockt');
    8 L/ I8 {: f( ^( q
  7.     });
    4 }3 w& ~$ n5 N% U+ A! t' {& V6 v+ H
  8.     // Listen for messages' }$ y) I6 `  f) y
  9.     socket.addEventListener('message', function (event) {
    . y( F, T8 _; G, ?0 L+ @  f
  10.             //接收服务器返回信息
    . x. N3 Q5 X, g4 V
  11.         console.log('Message from server ', event.data);
    : L; F3 N+ e0 X# C  T/ O' [
  12.     });
    , m7 H5 e$ ~6 g

  13. & d+ t6 z3 h- ?3 _& X
复制代码
伪直播主播页面
8 h4 b" Y. k' g4 J8 h

html

  1. <body>
    # V' E4 {) F9 p* x/ h1 v
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    - Y+ z0 M/ i) d
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    & f8 o/ ]$ q! G* V
  4.         画布
    % X! i3 l* \9 Q& o: r
  5.     </canvas>
    8 p6 V7 j" h/ i: g9 x+ Q& K* C0 P
  6.     <img src="" id="videoImage" width="350" height="700">
    5 g( Q& i* _* \
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>9 d7 S  |$ h1 r4 ]
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>& |( ^+ W' O1 I2 {' b
  9. </body>- i# d+ q, w& M0 m; j: l" K3 r1 K
复制代码

javascript

  1.     var v = document.getElementById("myVideo");6 r0 V- h; i: ^- P: i
  2.     var c = document.getElementById("myCanvas");, o: P* T& Y: X& ?, X+ f
  3.     // var c = document.createElement("canvas");
    " y, l  B% I! ?6 ]2 j0 g: {
  4.     var img = document.getElementById("videoImage");7 L4 V. |) T& k2 F/ _1 k5 b
  5.     ctx = c.getContext('2d');- T2 q2 [/ p  _
  6.     var dataUrl;% {9 t/ |! e( k# s  b
  7.     const socket = new WebSocket('ws://xxxx.com:9502');) b/ c+ A1 _! x8 K6 }* E9 B
  8.     //Connection opened
    / M/ b6 i/ r5 S2 y1 I
  9.     socket.addEventListener('open', function (event) {
    8 y3 l0 e- ~. @2 _6 X' s
  10.         // socket.send('Hello Server! im websockt');- N$ J0 }0 O% _3 ?9 Q
  11.     });
    / {4 v+ _9 G( c5 D6 @% _1 t
  12.     // Listen for messages" Z. K  A' a$ q# ?
  13.     socket.addEventListener('message', function (event) {4 m0 m/ j& N0 ^1 y& ^  v6 h
  14.         console.log('Message from server ', event.data);
    + D* R+ L" K9 ^! |2 f! {
  15.         img.src = event.data;
    ) i* d& g" j: e7 k
  16.     });! U! F, P3 M! G. s/ m6 s' j) w

  17. 2 ?) F( a1 C9 [  U. l9 w/ @% P# g
  18.     function playVideo() {5 H' W, \4 e$ r
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    ) F, ?0 D( U9 @: |8 M  T6 c' {
  20.         dataUrl = c.toDataURL("image/png");/ x' `0 {! ?6 S; i- y: E8 E
  21.         // img.src = dataUrl;
    % r# c" t1 p# {/ m
  22.         socket.send(dataUrl);9 l6 L  J, C. L5 H
  23.     }
    - r) x6 W; X, W' p. ~7 s6 S9 Z8 h
  24.     var tick;
    4 ]) I! @: o8 i$ v2 R* J
  25.     function aphla() {
    / {0 A9 f' o; m! @
  26.         tick = setInterval(function () {, X* u, I; R- l3 [
  27.             playVideo();
    ! T! r! {/ X" K4 x2 ]( H% A1 T
  28.         }, 1);8 }) h7 n0 @. c' W
  29.     }0 i- S6 D/ K3 Z
  30.     function vdStop() {
    5 E+ g4 {* R, N# b* |( s6 i# j
  31.         clearInterval(tick);. P+ F8 i- y) y# I% ?5 c
  32.     }3 P  l* F+ A; {. f+ z5 n
复制代码
用户页面& k) l+ u7 z2 k) H" z* i

html

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

javascript

  1. var img = document.getElementById("liveImg");. c5 R% e! t& z( w9 |0 b' S  N
  2.     const socket = new WebSocket("ws://lm.com:9502");2 j- ^% a5 Z4 f) u9 e
  3.     //
    # w/ O1 c( e0 n
  4.     socket.addEventListener('open',function(){0 ?% m& P) W, D* n' t& R) u
  5.      socket.send('Hello Server! Im live.html');& `/ g* E: b+ q* b6 Y
  6.     });2 U' @9 d# r$ A8 ~; o6 H7 X, ~
  7.      // Listen for messages
    1 T- z) n+ y  P; ?/ b; Q% I
  8.     socket.addEventListener('message', function (event) {! {) c) k3 c2 Y& E( f
  9.         //图片地址( x; v# `8 i* e3 T8 o8 |
  10.         img.src = event.data;
    # a. ?' j2 {& `3 {0 n) S7 M6 D
  11.     });
    $ A, Q, A1 v& L9 D/ |0 _
复制代码

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

: \2 x, n; l9 V" }

- D. L  R; ~- H* }' M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 10:04 , Processed in 0.136128 second(s), 20 queries .

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