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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  3 W2 w% e0 q4 _: \5 a0 R
  2. //创建socket服务
    ! ~9 v  E, O1 d1 V
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    6 M) H3 U5 j  b5 i* m
  4. //监听WebSocket连接打开事件+ ]3 H$ D1 U: b8 t& ~* v2 y
  5. $ws->on('open', function ($ws, $request) {
    " k* i; j# I% L$ G0 j1 C
  6.      var_dump($request->fd, $request->get, $request->server);& V; F' V0 \9 \$ {5 Q, Y/ v
  7.      $ws->push($request->fd, "hello, welcome\n");
    ; M% i0 L+ |$ J4 Z; j: d
  8. });
    / r( b0 F. [  }% B

  9. 9 Y" f# g! W4 S2 m: F
  10. //监听WebSocket消息事件
    + }  D/ B5 O3 F0 I  `" W. k
  11. $ws->on('message', function ($ws, $frame) {
    * X9 G0 D8 ~; q, x) d) j
  12.     //推送消息给所有用户* t$ o7 H5 }: v# ~. z
  13.     foreach($ws->connections as $fd){
    ' N, v- j: H" C
  14.         $ws->push($fd, $frame->data);! H8 V- P/ u% |% `
  15.     }, V0 T* T  n0 M# Y
  16. });8 S5 V6 I- m' q% V/ ~

  17. , S% _4 M" g, ]3 n# N# M; B
  18. //监听WebSocket连接关闭事件
    " T9 C& F4 t+ A# m) ^3 _0 k' I" r
  19. $ws->on('close', function ($ws, $fd) {; t3 V- @" c* T/ t9 t0 m. g) {
  20.     echo "client-{$fd} is closed\n";* C' r( R+ d3 ]
  21. });
    7 u) y; A; r# J5 T4 G8 n+ K
  22. //启动服务( b5 a  p; U3 w' ?
  23. $ws->start();
    : t; A! v7 p% \7 G( U/ S. d

  24. 7 J& e; H5 a; I9 N. {
复制代码
: W' a: L/ J# g/ g7 Q6 H$ d
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
% s2 G7 A# j$ F7 R2 x; x

代码如下

  1. //连接服务器5 h9 O9 R* Z7 ]3 S) o# L& [/ j
  2.     const socket = new WebSocket('ws://lm.com:9502');% n) s5 r7 Y8 m  [; j
  3.     //Connection opened, e  I' x5 `1 D
  4.     socket.addEventListener('open', function (event) {9 C3 S* J7 D- ^( y. x) P' ?
  5.             //发送消息给服务器
    ' P$ W5 F9 N# y- t
  6.         socket.send('Hello Server! im websockt');
    0 G$ V( @* z" m
  7.     });5 `$ [8 W, l5 {: F
  8.     // Listen for messages- p% Q) ]6 D) r, e4 x4 b3 Y& d
  9.     socket.addEventListener('message', function (event) {
    8 S: P% M8 m  B! {" K: ~$ l
  10.             //接收服务器返回信息
    . |/ Z# u" E. A9 m" Z5 A+ V
  11.         console.log('Message from server ', event.data);
    - H, Q2 p! P( h+ C6 W8 f/ W0 D
  12.     });
    $ c8 J1 }8 S' f' E$ D

  13. * Z- z9 [) t0 n- n2 S9 b
复制代码
伪直播主播页面
/ p; _* W8 g- h9 c% F" Z1 T

html

  1. <body>1 x/ o9 D5 V! U5 N+ _! ], g3 U
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>: A$ e- ~! p: ]& s, ~6 ]5 H2 k8 n
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">6 e3 G# Q! ~, c3 M% C
  4.         画布
    3 t6 @! C" X+ f$ W
  5.     </canvas>1 Q! k8 S( A1 t) r6 T
  6.     <img src="" id="videoImage" width="350" height="700">
    - L2 I! X$ Y% @/ [9 y+ U' w$ R
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>3 k7 P+ b$ k! Y, @
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>( L- X/ F9 @. g5 {% W
  9. </body>
    1 ?  N) E% x  y$ ^
复制代码

javascript

  1.     var v = document.getElementById("myVideo");2 Q4 O8 {# M3 J4 |* M7 q9 m
  2.     var c = document.getElementById("myCanvas");6 X7 ^( O3 _5 L3 q- f: W- E* N- F
  3.     // var c = document.createElement("canvas");
    : V! R& r' A6 U$ {* P; |! s
  4.     var img = document.getElementById("videoImage");
    8 V. M( C" n5 V
  5.     ctx = c.getContext('2d');
    $ N6 h+ d* W$ f& q2 ~( Z/ V
  6.     var dataUrl;3 i! L3 {! {$ O, W, [: [
  7.     const socket = new WebSocket('ws://xxxx.com:9502');4 o" ]. O, d3 X9 v: n* }! B  J
  8.     //Connection opened" j: m. J' N: |
  9.     socket.addEventListener('open', function (event) {
    0 U8 |' T+ T  e2 i; U6 o4 C, ?5 N+ K
  10.         // socket.send('Hello Server! im websockt');. Q8 ]; m( `' b
  11.     });9 h! C" g4 S' L
  12.     // Listen for messages
    1 l* X1 Q6 |1 j  m8 B3 C
  13.     socket.addEventListener('message', function (event) {
    ( ]. U+ S( I: _! R' u
  14.         console.log('Message from server ', event.data);( |: c' f' m, U3 \8 m5 B
  15.         img.src = event.data;9 P( j7 _' V& R$ }/ P3 _
  16.     });
    ' f, ?: u% i1 V% B6 q7 B' e  e
  17. 7 T+ D! e4 Q2 |, u+ J% {9 A
  18.     function playVideo() {/ P3 Y2 j( g1 ~; o3 T# |
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    ! T" K* z1 I+ r4 G* n( D. B
  20.         dataUrl = c.toDataURL("image/png");# o# [9 d  V- S, s! u5 f# M. [3 b  E
  21.         // img.src = dataUrl;' P: V# g' a7 |% J
  22.         socket.send(dataUrl);3 F7 m3 l' A* i4 [) ]
  23.     }
    8 m2 g1 n  c8 Q4 u7 L: }
  24.     var tick;8 k6 x# \& N& s  M7 M$ \5 L  r
  25.     function aphla() {
    1 }4 ~4 B) l9 C' {1 k
  26.         tick = setInterval(function () {
    " i+ O0 L* j* t* ^) K2 m; V
  27.             playVideo();$ T" [2 t9 X) S- i
  28.         }, 1);
    ; K! Z6 L9 Q1 l8 \" Y8 l) {! G
  29.     }: e1 n! L1 ?7 g. k+ U5 }- G, a
  30.     function vdStop() {$ V8 f$ C! B1 s1 H/ }' N% R
  31.         clearInterval(tick);
    $ |+ ]9 j, ?3 |7 V
  32.     }
    ) P6 t; J- c+ \0 `6 t: P1 U. I
复制代码
用户页面
. `  O2 D+ j/ u6 ~4 Y

html

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

javascript

  1. var img = document.getElementById("liveImg");
    9 e: N% A; i0 I( q
  2.     const socket = new WebSocket("ws://lm.com:9502");( J6 d* r6 Y( ]  v
  3.     //
    , n4 J# m0 E- D9 r; _5 D
  4.     socket.addEventListener('open',function(){3 Y+ [% n' r" S; E( r
  5.      socket.send('Hello Server! Im live.html');
    ' J+ u' _' z2 I% Q
  6.     });
    5 Z1 v0 w6 Q% D; ^
  7.      // Listen for messages2 e+ i  h4 F  L
  8.     socket.addEventListener('message', function (event) {" @# {$ C3 \" ]8 ]* H  J
  9.         //图片地址
    ) G4 ~9 r- }2 p) O) P
  10.         img.src = event.data;
    $ _1 X! @% B# U% ?3 }) |
  11.     });7 l, t" P# G2 z5 X* A8 ^# a5 X/ M
复制代码

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


+ v3 g7 }' z" v; ?. ]' W- s* z
- s* D9 z( N6 k9 |2 x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 03:12 , Processed in 0.050378 second(s), 21 queries .

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