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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    ) |2 p+ O1 ?9 F5 J
  2. //创建socket服务
    1 K  W7 n- M+ i7 U( J/ r
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    . f0 a& [( Q! e& f
  4. //监听WebSocket连接打开事件
    0 B7 G- _$ x. b$ E9 P: F$ x2 j
  5. $ws->on('open', function ($ws, $request) {. C* z: v( o4 d, B
  6.      var_dump($request->fd, $request->get, $request->server);6 E" y9 e% t; |
  7.      $ws->push($request->fd, "hello, welcome\n");
    ; x- z) v+ c, Z
  8. });% p* K1 V) P: ]: S  o
  9.   g  k) x7 W9 U! Z* {$ A1 M% N
  10. //监听WebSocket消息事件
    % j' A9 O: b& }; N$ h0 B, {
  11. $ws->on('message', function ($ws, $frame) {- p& f$ [* g9 P" Z. O; i+ s
  12.     //推送消息给所有用户
    ; A  g1 ?+ H* j- @! E/ I' `
  13.     foreach($ws->connections as $fd){
    ' |0 {1 z3 d' L- M' M4 p8 h$ f# N; ?
  14.         $ws->push($fd, $frame->data);
    % P7 T% U+ }/ Q" Z, M! A' J/ U
  15.     }
    ( N5 |6 f2 D  a' z
  16. });, p( A* \$ O$ X4 {& Y1 @: G- k

  17. $ `6 }8 F( V# V9 B% s! m7 B
  18. //监听WebSocket连接关闭事件
    4 F/ z1 A' q5 X' z+ y7 D
  19. $ws->on('close', function ($ws, $fd) {
    4 D" |% G& [3 h' {% p
  20.     echo "client-{$fd} is closed\n";$ c1 h5 w& F* ~3 f
  21. });
    ; T9 Y3 c7 c4 X5 E
  22. //启动服务6 s9 D  z; S& x) u; [
  23. $ws->start();
    3 {& D' M- Q0 L5 t. [# r7 Q
  24. 4 f6 u, q7 W. i1 Y
复制代码

4 ?( D& L) F! MWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
6 C8 [( i" z0 m, d7 z' A" y# A

代码如下

  1. //连接服务器
    : o' [2 }4 T( z% M
  2.     const socket = new WebSocket('ws://lm.com:9502');3 s' E1 m9 ]. a& j, ^5 m* D9 x
  3.     //Connection opened
    6 W( v9 i1 j& _9 s4 x
  4.     socket.addEventListener('open', function (event) {
      G' i# f% R! ^5 J. C0 l( k) ~
  5.             //发送消息给服务器/ r0 p$ O! g# ]
  6.         socket.send('Hello Server! im websockt');
      L8 m/ Y  O+ o$ j  N0 n( E% ]4 g6 D
  7.     });
    ; P( @+ C1 D9 J& M1 q+ f! |
  8.     // Listen for messages
    + E3 [2 N! L, \9 X, \: q
  9.     socket.addEventListener('message', function (event) {
    & C/ Q: p* J& t: P2 Z; Q
  10.             //接收服务器返回信息7 ~& @8 G( r. |4 ]; M; R! q
  11.         console.log('Message from server ', event.data);+ W2 b) e% R2 u
  12.     });
    , v  c. ^: f. Q5 B$ W

  13. 4 R* k2 n; k* g7 f9 ?1 I
复制代码
伪直播主播页面
! ]8 z& D. r8 v) R- N- E

html

  1. <body>
    3 z* p# R* j0 H7 i; D" Q1 T" O. \
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    / B" l( l9 p& C1 }6 C- N
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">3 x1 C$ B! f. [' Y! w7 D$ r
  4.         画布( Q! E4 k/ k. e2 c' E1 i
  5.     </canvas>4 l* N* o) N- J
  6.     <img src="" id="videoImage" width="350" height="700">0 \+ N6 @# _: x8 b% i- D- z
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    " X, `& i- O4 Y7 B* I
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>8 Q% H% W- N/ \' y0 j' U
  9. </body>
    - s3 i8 i  D! j, N' Q
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    / a. Q0 R) w. V
  2.     var c = document.getElementById("myCanvas");- w! X3 d$ T9 V8 @  Q0 n
  3.     // var c = document.createElement("canvas");& M, y2 V0 \5 E* u1 r8 g( `; M
  4.     var img = document.getElementById("videoImage");
    6 P& q  y: _) w- L  G
  5.     ctx = c.getContext('2d');
    & C7 ?! s3 D, q0 k& ^2 e  E* s* U( B8 q
  6.     var dataUrl;
    / t- y2 T- z# ~- r: |9 n; V" w8 I+ M2 g
  7.     const socket = new WebSocket('ws://xxxx.com:9502');! d+ x8 H2 ]2 X3 w
  8.     //Connection opened
    ) U1 q5 k" p' p; M' E
  9.     socket.addEventListener('open', function (event) {
    ! N$ X' W1 t( `( H9 }! X# N; q: I
  10.         // socket.send('Hello Server! im websockt');
    / |6 q, E; f3 J& y$ X4 C
  11.     });2 \. m2 u7 z* a( t( O" \
  12.     // Listen for messages
    ) }3 E6 v3 u/ M
  13.     socket.addEventListener('message', function (event) {4 f- J; F4 R$ ^6 I$ Q7 I- i2 K, `
  14.         console.log('Message from server ', event.data);
    5 B0 E% \% R0 e- @/ H& U. |
  15.         img.src = event.data;4 W* o0 [9 s" ?! J' b
  16.     });
    ! D8 W" P+ b# W$ O: {$ }

  17. . S+ N' P, x4 y5 G* C3 _9 Q# B# K
  18.     function playVideo() {7 m' a+ c) X4 k- Z! V5 ^4 [
  19.         ctx.drawImage(v, 0, 0, 350, 700);1 N5 t' J- ~  l9 `$ t: A
  20.         dataUrl = c.toDataURL("image/png");
    + K! V: c, t9 v; R& ^
  21.         // img.src = dataUrl;
    % `( T, P+ T. Y" v; A3 t, N3 r( }
  22.         socket.send(dataUrl);
      T3 Z4 G: ^& i' I# B
  23.     }
      ^6 e# x- [% R2 `5 {
  24.     var tick;  e% e8 X* p1 Y# F1 ?* P2 e
  25.     function aphla() {5 |3 f. _% x; r+ x( P* a( a
  26.         tick = setInterval(function () {. c4 r& g; U, i4 H  ]
  27.             playVideo();
    + R( s7 X: U; C1 M7 A2 B+ P+ I+ a
  28.         }, 1);
    2 I6 u+ h  f8 R# v. M
  29.     }5 x& c( k8 t0 U# q' g
  30.     function vdStop() {
    ) R# {- g$ y0 Z: \3 [
  31.         clearInterval(tick);7 m$ y0 y1 @; M  X% w
  32.     }! Z* t$ r. A4 S+ P
复制代码
用户页面
2 P$ _, x7 H( W$ M8 {

html

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

javascript

  1. var img = document.getElementById("liveImg");5 n# _6 }7 \5 k5 w4 n3 r+ S3 K! O  ^
  2.     const socket = new WebSocket("ws://lm.com:9502");; ~( C$ N8 G9 W* ]* r3 \
  3.     //  ~, E. G$ N8 _* R/ v  Y
  4.     socket.addEventListener('open',function(){. P$ I: r, h* L$ N& O& q
  5.      socket.send('Hello Server! Im live.html');8 ^3 K& @' _  [$ {3 q
  6.     });
    1 c; Y% J/ k, A0 x0 Q
  7.      // Listen for messages
    . e) a  i7 X3 }% i
  8.     socket.addEventListener('message', function (event) {
    5 V9 {' L6 V& n" U* ^" s9 k
  9.         //图片地址
    ) j. {$ n2 {" y, \2 }
  10.         img.src = event.data;: H" b8 {$ N* S4 B" l' X
  11.     });
    " Q9 k; |; y# a4 _+ b: d/ q, o
复制代码

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


% h5 F+ Q" k& B5 U. U# M4 h. W  k8 S3 A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 17:09 , Processed in 0.051478 second(s), 20 queries .

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