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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);    t6 K: T7 A* n( }- R! L+ q
  2. //创建socket服务
    7 ^" F7 N: R. y' i$ f$ x1 t+ X
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);. H9 y& ^; K  q  [# c# ?
  4. //监听WebSocket连接打开事件
    ! w, ]5 b4 j4 n' E! G2 c
  5. $ws->on('open', function ($ws, $request) {
    5 i2 d( o: X6 p; }2 Y0 @
  6.      var_dump($request->fd, $request->get, $request->server);& \! O1 g% B6 T" P) R' a
  7.      $ws->push($request->fd, "hello, welcome\n");# _" B; ^& n- }: g; X
  8. });
    4 a( S, U" y2 P4 R
  9. 2 ]7 V: N# C. h
  10. //监听WebSocket消息事件
    9 n8 i" U3 G- s, \. }
  11. $ws->on('message', function ($ws, $frame) {
    4 o8 e( @  N2 u- u, K0 A( s
  12.     //推送消息给所有用户
    " ]- J$ D$ N! w. S. ?, D" o! J
  13.     foreach($ws->connections as $fd){! e/ H" n; d" c
  14.         $ws->push($fd, $frame->data);0 }5 }+ n* E. i* ?- ?  t
  15.     }
    ) ~2 p! ?: y# ]6 @& r" R. L* g
  16. });3 G1 [8 ?0 l( e( ?
  17. , x9 w3 f; x5 {) h1 T* h
  18. //监听WebSocket连接关闭事件  T! s1 M. b; Z" c% L
  19. $ws->on('close', function ($ws, $fd) {
    % n! `  b- K* c7 v
  20.     echo "client-{$fd} is closed\n";
    2 Z9 c5 _  r! r! f& _
  21. });9 v7 h% I( P% J# `6 O
  22. //启动服务
    5 R* b  V, [5 U) U4 U& `/ n
  23. $ws->start();/ l2 n/ r% [! j$ ?
  24. 3 ^  B) {5 {* o3 G* P7 O( S' R: o
复制代码
/ V9 t6 `0 d! i; M2 K! Z5 l
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端; J/ I0 J$ w1 u* c1 W& B6 ]

代码如下

  1. //连接服务器' s/ G' p3 I8 k) i
  2.     const socket = new WebSocket('ws://lm.com:9502');
    + N: F- N7 x" y" e) f# D7 r1 b8 }
  3.     //Connection opened
    6 I; I( H) v6 n+ l5 G0 [
  4.     socket.addEventListener('open', function (event) {
    - Z; }7 ?! n9 w
  5.             //发送消息给服务器1 {& @# P+ A& n4 c1 E! \' Q$ K$ Y  [
  6.         socket.send('Hello Server! im websockt');9 t7 k1 X  k5 s  N6 A7 R, Z
  7.     });
    4 e- u4 q/ K( M* ~  e
  8.     // Listen for messages) @% K$ e0 ~2 J& W# S2 g- E! j
  9.     socket.addEventListener('message', function (event) {+ a- h8 t9 b$ _( e' g: _+ q
  10.             //接收服务器返回信息* y% o# H2 r3 w2 }$ @$ T
  11.         console.log('Message from server ', event.data);. X7 R$ s5 K- h: y4 x
  12.     });
    ! u9 y: n2 A. _& U% e0 V

  13. 1 f5 u6 }# X1 I' n6 [
复制代码
伪直播主播页面
" j! B6 l/ A# X, E8 L

html

  1. <body>
    % j5 S2 [, o/ M. U  |% m. b
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    % T" g- i, V7 m4 ?) R( T2 q
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">3 t2 |( m2 @& p# q) l7 q
  4.         画布
    9 y, ~- w" {9 l  ^: u
  5.     </canvas>+ m4 t& y3 I" i1 d2 f  k  t; F6 D
  6.     <img src="" id="videoImage" width="350" height="700">
    0 m" T/ L& W: v5 b$ e; Z3 p$ O
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    & k' i4 V0 o& ]/ b5 U
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>1 {- L& z4 i% T
  9. </body>  V* t" M: |$ k; g& N4 X
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    $ [6 l; K8 Z( s" k7 T- u' q
  2.     var c = document.getElementById("myCanvas");4 U6 c; d: a9 m9 U# v2 g  d% G
  3.     // var c = document.createElement("canvas");, l, g- S8 e6 |- u# l4 [  [$ b" s
  4.     var img = document.getElementById("videoImage");
    6 V- D& W! a2 Y* h6 M1 V3 o. P/ G
  5.     ctx = c.getContext('2d');; t. I4 p4 M* b' Y
  6.     var dataUrl;
    ( g; D: C! z7 f- ~+ l
  7.     const socket = new WebSocket('ws://xxxx.com:9502');3 N# h5 L0 o0 ~4 \9 _( M: V" u5 D
  8.     //Connection opened
    5 B7 O" B6 G: C# M# T- Y: }
  9.     socket.addEventListener('open', function (event) {
    " h: |$ I" A$ @$ J/ Q$ Y9 L9 W" w
  10.         // socket.send('Hello Server! im websockt');
      e! D( ?2 B5 q9 {. X
  11.     });3 y. N: b8 f6 H* I& M& l( v' i0 l
  12.     // Listen for messages; `  |: n7 W) S
  13.     socket.addEventListener('message', function (event) {
      l' R/ u, a- z. \
  14.         console.log('Message from server ', event.data);
    ( o: E: V- |/ e0 O, L. x1 ]3 p3 {. y
  15.         img.src = event.data;7 }4 A% l$ _5 t, @
  16.     });
    6 d4 E4 {! ^% C) p% Y

  17. 3 d6 J6 I) A) _7 f
  18.     function playVideo() {
    - ?* ?( w2 J0 s" c5 g$ p
  19.         ctx.drawImage(v, 0, 0, 350, 700);2 D' `2 D& ~6 c% R6 r
  20.         dataUrl = c.toDataURL("image/png");0 ]1 h# \9 q4 e5 f
  21.         // img.src = dataUrl;
    2 C! x4 j! r4 M$ D9 e' S0 g
  22.         socket.send(dataUrl);
    # n- G( Y* R  o/ e" R: k) e
  23.     }
    , n: F: c6 o# c9 l9 `3 Y# c4 j
  24.     var tick;. T  [: w0 H5 N
  25.     function aphla() {
    : y5 ]6 ^. z% d7 j9 l5 T
  26.         tick = setInterval(function () {( q- |* j, \' r* O& d# Q
  27.             playVideo();
    : w: m, V7 V; b% t: S2 Z  N
  28.         }, 1);
    2 y) f/ g" e  H0 U8 L, n
  29.     }: H% P; w7 ^7 {: M
  30.     function vdStop() {
    # B& M, Q. M' Q
  31.         clearInterval(tick);- e0 Q6 [1 |# L0 Z
  32.     }
    6 v/ n% T7 U1 d" Y( e6 D8 G. L
复制代码
用户页面
2 e: R. r. Z4 C- b3 ?2 u

html

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

javascript

  1. var img = document.getElementById("liveImg");# [# y9 j  a) t( h/ G$ l& Y
  2.     const socket = new WebSocket("ws://lm.com:9502");
    ; n* K3 n+ U1 O% F+ b
  3.     //6 ?% W4 W/ k8 m6 g# k3 b6 A! A" R
  4.     socket.addEventListener('open',function(){3 g% ^9 y( W7 m4 V& N* V+ `* E
  5.      socket.send('Hello Server! Im live.html');
    4 L; H- x, q2 R( b# g' J  q
  6.     });
    + |  L1 v9 B  t2 m# _- o8 L& k; Z
  7.      // Listen for messages
    4 q9 y! W* h* @$ l  e$ a
  8.     socket.addEventListener('message', function (event) {
    " }4 V0 a$ s# T/ j
  9.         //图片地址7 v2 f- k5 S5 d9 ^
  10.         img.src = event.data;; ^1 A( c3 P4 g9 q# O: C" t5 y9 \
  11.     });
    / @+ P0 P4 Y  t1 z9 p: b
复制代码

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


# m, Z6 m+ Q" {  w1 C4 q
( q9 R+ e2 C: {$ H: _0 Q+ t
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:42 , Processed in 0.060425 second(s), 20 queries .

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