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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  ; M; K% `: \& H$ n/ ?
  2. //创建socket服务5 n; p* I: l" D# j
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    , r9 \0 g, C" _6 D; _1 k& u8 `9 l( U5 h
  4. //监听WebSocket连接打开事件
    : y. \( y9 j; E
  5. $ws->on('open', function ($ws, $request) {
    1 M) \6 l4 t& z  B. }' ?( a
  6.      var_dump($request->fd, $request->get, $request->server);# X! |" q+ p+ k8 v
  7.      $ws->push($request->fd, "hello, welcome\n");
    # t( y! a; u- K0 z: D
  8. });
    9 F) m" r1 l  _* Q% s

  9. " D( F# T; w1 G2 _/ y; L( S
  10. //监听WebSocket消息事件
    % ^7 v* A) m! f& |0 ]$ E4 n
  11. $ws->on('message', function ($ws, $frame) {
    4 f  V- R- h, O
  12.     //推送消息给所有用户
    8 C) r2 w  N7 S7 {2 v" |
  13.     foreach($ws->connections as $fd){2 _# \: o/ A1 S, V8 d
  14.         $ws->push($fd, $frame->data);/ o$ L/ c6 ^: b3 ?- x0 p
  15.     }5 W1 a6 C' f9 N6 |- W, {
  16. });
    4 _# r* s* i0 }2 m2 F

  17. 1 t$ g7 S% F, I1 U1 B$ j+ o7 F
  18. //监听WebSocket连接关闭事件0 e6 [( y2 o, S
  19. $ws->on('close', function ($ws, $fd) {! ~/ R- ^+ a( a) k
  20.     echo "client-{$fd} is closed\n";" ~1 a. f) M/ U/ t% b2 c9 m
  21. });  O! C. K2 f0 P" H1 n" s
  22. //启动服务2 U; B0 a1 [  ?% F: F/ z
  23. $ws->start();
    - Y4 w' r1 d, [/ g8 [% V6 k+ B" x
  24. 5 p, H- k# Y$ N9 ?
复制代码

, J6 g% A- [0 D/ I4 k6 ?Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
: a( k5 O% A8 ?. ^! B& }

代码如下

  1. //连接服务器
    & m: X9 \' [# e5 ^- a, r3 h
  2.     const socket = new WebSocket('ws://lm.com:9502');  @4 l) ~2 }0 u0 v2 F& [
  3.     //Connection opened
    * P# ]( ]" W3 M& a  B$ e. `
  4.     socket.addEventListener('open', function (event) {9 O2 @& D+ X4 V* s- E( m4 d" A- _
  5.             //发送消息给服务器, }  r8 g( @9 Z, P6 I) T+ b2 g
  6.         socket.send('Hello Server! im websockt');: `9 z" W7 Y+ S4 R' |# s) _
  7.     });
    6 b5 k( T) E: ^# J# M$ K6 b6 _
  8.     // Listen for messages
    % }3 t3 t. Q  F  F- O' h: L
  9.     socket.addEventListener('message', function (event) {
    * {" u! |" P: b, k5 S0 H0 v8 p
  10.             //接收服务器返回信息) ]9 o5 I8 d+ {; E$ L+ A; ]
  11.         console.log('Message from server ', event.data);
    + I' G+ o3 t! y2 m9 j: o
  12.     });
    % O! Y6 X1 Q, i7 _9 g% d, x; C  Z

  13. ) B0 |3 p: B- n9 ]$ Z
复制代码
伪直播主播页面
/ W* K& b$ \$ C

html

  1. <body>2 }6 ^7 s) S2 T$ w$ u
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    " S1 u, X2 x0 q2 n7 G
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">9 Z9 H6 D6 O* b& ^) U
  4.         画布
    4 _3 i, `  B7 S
  5.     </canvas>0 N. {" J9 ^0 m% X$ A5 U1 `: w4 h
  6.     <img src="" id="videoImage" width="350" height="700">
    . Y3 f/ t. T% P% Z
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>8 ?/ ^/ v* B" g9 ?4 k& @
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    . B, w0 j6 X, H3 V- n
  9. </body>: Z/ y4 r8 U& l
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    " u5 \0 [' i. C" x" G1 N) U+ s
  2.     var c = document.getElementById("myCanvas");& C, F( m$ E* \# R: P
  3.     // var c = document.createElement("canvas");! h  R! F/ ~$ L- M" S7 b
  4.     var img = document.getElementById("videoImage");
    2 x+ o( h+ R  n
  5.     ctx = c.getContext('2d');
    2 G6 A/ c& {6 Q) j
  6.     var dataUrl;/ L, G2 s/ y2 c
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    $ }6 O0 p! o$ Q6 G5 X$ B+ d
  8.     //Connection opened$ j' k2 G5 ^2 K
  9.     socket.addEventListener('open', function (event) {% f$ w+ ?# Q, D: J: x
  10.         // socket.send('Hello Server! im websockt');8 z0 `$ Q$ o. R
  11.     });
    : ]1 E/ B: l+ d1 D8 m
  12.     // Listen for messages
    8 z5 d( ?" q+ @! [* t# `
  13.     socket.addEventListener('message', function (event) {
    ) J$ T9 W' U- X) r  \6 c8 h9 \
  14.         console.log('Message from server ', event.data);! K1 Y# l8 I% ~+ s' L$ h! ~8 `- R8 v
  15.         img.src = event.data;( B% n9 d) i% }2 d9 l1 _; ?9 O# g
  16.     });! `4 k, }6 R1 E( o& p7 V

  17. # V+ o  {: l& L1 v' q4 J
  18.     function playVideo() {1 ^" C- y+ Z$ a5 C+ R; E2 h2 f) S
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    5 _5 Y8 k% `/ L! T; f5 g
  20.         dataUrl = c.toDataURL("image/png");0 E; `" j3 h+ P& M& \- n9 e% A
  21.         // img.src = dataUrl;
    ) g( E4 K. k0 G2 B
  22.         socket.send(dataUrl);
    7 R; }- p" i  h7 `' g3 f5 r3 D4 t
  23.     }
    % Y; h+ f4 O/ ~& h
  24.     var tick;
    8 {# l/ S; }% Q) h
  25.     function aphla() {
    ) R) d$ E7 t  C
  26.         tick = setInterval(function () {
    & k4 Y7 _9 V4 I' l( b
  27.             playVideo();
    + D. \( H0 a0 M# M9 x5 W
  28.         }, 1);
    . W# h8 W5 h! m
  29.     }: l' [) J- r1 a* {+ N& i; ^
  30.     function vdStop() {9 n2 X7 @2 M4 b1 e" A" }2 z
  31.         clearInterval(tick);! p' \4 `. F9 K- k3 a* F
  32.     }
    8 J) J5 S9 [+ m$ I& c' k& e" F
复制代码
用户页面
# l2 ^9 B+ A. L& i3 e' f  A

html

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

javascript

  1. var img = document.getElementById("liveImg");
    ' L4 p- @0 s2 X2 k
  2.     const socket = new WebSocket("ws://lm.com:9502");
    ; a" \1 j% V; ?/ l' ]0 |# o3 H& [/ T
  3.     //1 w& o$ @, s+ w# v$ ?) `
  4.     socket.addEventListener('open',function(){& ~- i8 I% e' q1 S6 R) V2 F3 F
  5.      socket.send('Hello Server! Im live.html');; o9 O9 n/ ?6 d: f8 Y  c  a
  6.     });4 @3 ^5 C4 ?3 g6 W9 k3 ?
  7.      // Listen for messages# K6 c: J+ Z/ q" G
  8.     socket.addEventListener('message', function (event) {% h0 I$ t' i. l- c& g1 c
  9.         //图片地址
    : Z* b/ R5 h; I! u5 d+ o$ U
  10.         img.src = event.data;) b2 k, y2 C" s" p! P
  11.     });
    6 u- |5 E. p3 k! p
复制代码

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


1 u8 x: Z9 G$ o8 H9 i* E" g
; I1 G6 h2 [+ U: A! f9 ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-8-4 07:08 , Processed in 0.061101 second(s), 19 queries .

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