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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  $ A& ?: g& s% }& C* Z1 r+ g/ t( r4 D8 w
  2. //创建socket服务4 {$ @8 \; z4 [6 L: Q1 |
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    ( g* o& b+ D; s! Q9 f* {
  4. //监听WebSocket连接打开事件
    4 O9 I4 ?4 L0 I& L
  5. $ws->on('open', function ($ws, $request) {- o9 g; F3 B. G3 s" T
  6.      var_dump($request->fd, $request->get, $request->server);
    & \7 _4 x0 l1 T  V$ d/ F: R7 V
  7.      $ws->push($request->fd, "hello, welcome\n");
    + K, o4 w/ ^$ X, m! I( n
  8. });
    ) T8 r# s! b9 W' n8 [' r2 c5 ]. l
  9. 6 K7 u5 L4 j( c8 c" V" _5 N8 H
  10. //监听WebSocket消息事件. x6 l) L$ Q  p- h
  11. $ws->on('message', function ($ws, $frame) {
    / |2 r$ v" G0 z
  12.     //推送消息给所有用户
    4 _1 Z" `+ U* x( B6 U- h# P
  13.     foreach($ws->connections as $fd){. l% _" n$ r& _: D+ D& j6 m1 L
  14.         $ws->push($fd, $frame->data);# z  l; v/ P- g1 l* j
  15.     }
    7 a; a( o7 f; z( H0 k4 i
  16. });
    5 {; L# f1 W2 _3 _% {

  17. ) ~- M/ L1 R/ l+ p$ b5 t
  18. //监听WebSocket连接关闭事件
    . ^+ `# O$ Z& z3 {/ T. v
  19. $ws->on('close', function ($ws, $fd) {
    + ]( m" l. R1 J8 L7 P
  20.     echo "client-{$fd} is closed\n";
    . b, _9 g- r9 w, R" }! [/ q2 W% E
  21. });5 j, W9 ~; I% R: G/ M' G
  22. //启动服务+ u- u4 Y; y. l$ v( {& t
  23. $ws->start();
    # \; m5 J  w+ X6 G
  24. $ q1 g" T8 O8 H  V0 t
复制代码
6 A3 N( c1 w8 q/ u! t7 b
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端: f7 I  d' [8 s2 J

代码如下

  1. //连接服务器+ i2 w5 M! M5 ]7 g4 ]4 G$ Q% r) U0 w
  2.     const socket = new WebSocket('ws://lm.com:9502');" C4 D* _. j7 \3 v" @
  3.     //Connection opened
    % |( B& U1 y% q) }
  4.     socket.addEventListener('open', function (event) {
    # O" K. S. C" J3 P! a4 f
  5.             //发送消息给服务器
    ! H8 |4 }5 q1 H6 j  n% H
  6.         socket.send('Hello Server! im websockt');
    0 M/ S2 \* D% q. O" s  u
  7.     });
    5 V& P: ]! a! y% f4 m
  8.     // Listen for messages4 H8 g9 j/ a8 I( R8 p- p' j
  9.     socket.addEventListener('message', function (event) {
    ! {$ A7 [6 f1 }; ~3 s  j
  10.             //接收服务器返回信息
    ( T6 W* a4 K1 W3 d6 Q- W! e
  11.         console.log('Message from server ', event.data);
    6 R" O4 e. u( W0 L" U5 Y
  12.     });
    5 S; ^+ ~" A0 W; s

  13.   V8 l- z3 d9 q
复制代码
伪直播主播页面
. W8 U8 D# f5 i8 T% [! j8 |$ e

html

  1. <body>
    ' @- o/ T% m  z
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>( n$ \7 D. C- f, G+ {+ C- p
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">+ _7 p. Z) K$ R( n' |) @5 H$ j
  4.         画布
    ' o, T1 E2 }5 P, g
  5.     </canvas>6 m9 \9 H; A7 Y& @" r
  6.     <img src="" id="videoImage" width="350" height="700">6 R# P. Z" b% V7 R  Z; k' y
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    % U+ v2 q) D- D" X: B
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>3 |7 _0 {: m* u3 P4 |6 u3 L
  9. </body>: s& D9 B; i2 X# O- o  Y
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    " r" W% a# Y4 x; E9 R
  2.     var c = document.getElementById("myCanvas");' h& T8 z0 S. f& v" C/ K" o7 \
  3.     // var c = document.createElement("canvas");  I- N7 M8 }7 d9 u
  4.     var img = document.getElementById("videoImage");8 Q2 ?' R' _. T8 L0 |
  5.     ctx = c.getContext('2d');& H$ N% P" I6 n6 y0 @
  6.     var dataUrl;! F- D' A1 y, B" a; T6 ]
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    ( A$ B2 |  \" P) q
  8.     //Connection opened
    ( u) y8 `, ]5 h. L/ e
  9.     socket.addEventListener('open', function (event) {
    ' S# {: d$ N1 Z. r+ |& [
  10.         // socket.send('Hello Server! im websockt');
    6 R$ X. _+ i) N) }
  11.     });
    1 p7 T% M1 k& N6 O
  12.     // Listen for messages; [' {# ~, M) L+ Q  G3 N9 U
  13.     socket.addEventListener('message', function (event) {
    # P( H8 n6 c' r+ e' I4 p+ f5 v, u
  14.         console.log('Message from server ', event.data);: A: g# R( m' i# g  V) M7 z) M( `5 p
  15.         img.src = event.data;
    & Y5 ^9 G& p; y8 j, M
  16.     });' i& Q% g% ?) F- Y( @3 ]

  17.   I. r% z. R" ^& K, \( u' A( g) c
  18.     function playVideo() {4 b+ l. R( G& E/ |- g7 v
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    ( l0 h' E' m8 K5 e
  20.         dataUrl = c.toDataURL("image/png");
    ! a  [( o8 w# |# b
  21.         // img.src = dataUrl;2 g9 `& {* Q/ q& u8 j
  22.         socket.send(dataUrl);; y* s8 ?7 t1 F
  23.     }% c4 h' U  V1 T; L
  24.     var tick;
    $ {2 Y9 {. e" @$ ^/ |* [$ }
  25.     function aphla() {
    2 [/ m9 j; g1 s+ S! ]$ ~3 d
  26.         tick = setInterval(function () {! W, G2 U3 _2 Y  T
  27.             playVideo();
    0 O% P- {) @- E8 e/ M
  28.         }, 1);& t) o6 U  K, T  F8 i' U+ L3 l
  29.     }$ ?$ }& Q- ~% t0 i& r" k" ]
  30.     function vdStop() {
    ' H2 ?. }# h  c# D1 X
  31.         clearInterval(tick);
    : m4 u; K& U5 H  r$ G
  32.     }
    . l1 ~: t  L( n
复制代码
用户页面( c, l% O2 v6 ^; y

html

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

javascript

  1. var img = document.getElementById("liveImg");& `0 i6 v7 {0 g$ D7 M% L9 c8 t0 E
  2.     const socket = new WebSocket("ws://lm.com:9502");* z4 k5 z' h* e: d" x' c4 g
  3.     //
    ) O* [# V8 W# C/ L8 x, ^% p
  4.     socket.addEventListener('open',function(){6 X# z9 H+ ~3 G* i/ _9 z
  5.      socket.send('Hello Server! Im live.html');
    2 ~' q- X4 V# @3 X7 B
  6.     });
    5 r1 _! l5 d# X4 M+ ?
  7.      // Listen for messages
    4 X$ d8 ?+ g/ c; d
  8.     socket.addEventListener('message', function (event) {& _/ n' d9 r  m# I4 u. I" C
  9.         //图片地址5 H( R' M, f2 @+ |& }1 z  w4 E
  10.         img.src = event.data;
    ' l# i* h* M# r4 z6 o& x4 \$ `
  11.     });
    % }& j0 |% ^/ {
复制代码

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

" g  o) I6 |) g" {6 }4 D2 P  s  W# D
# g' W3 n2 G, ]% z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 04:16 , Processed in 0.060814 second(s), 19 queries .

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