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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  . U0 i( k8 v" R& [* N* a  D
  2. //创建socket服务
    ) o; l* `& I3 l! ]( K5 j; S
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);+ c; Z, U$ S9 |$ p
  4. //监听WebSocket连接打开事件
    ) ]; q) E) B: J: ^9 R0 L$ e' J
  5. $ws->on('open', function ($ws, $request) {  i/ k- T9 [- x" K. i# ]4 I4 P/ M
  6.      var_dump($request->fd, $request->get, $request->server);" n! K+ L2 l9 ~! c8 D
  7.      $ws->push($request->fd, "hello, welcome\n");
    8 Y  x: \" ?' T4 N, H
  8. });
    4 g0 N0 n" B! l" m% ]7 D% t
  9. ) x( C: Z2 W- e$ F; ^
  10. //监听WebSocket消息事件
    ' G% {( C9 x0 ?8 j# S
  11. $ws->on('message', function ($ws, $frame) {/ f2 w) W8 O, T: G$ A, M/ o
  12.     //推送消息给所有用户5 r1 ~  K6 B/ S0 o
  13.     foreach($ws->connections as $fd){9 i4 }% y' T; ?6 I  L1 K
  14.         $ws->push($fd, $frame->data);! X; _/ }- \0 o& z6 o& \& n. W; b
  15.     }
    8 X, Z- |' M) x7 d' u+ k  G+ {
  16. });
    , G4 k5 c+ e5 `% G0 k5 d5 U
  17. , W4 X: O6 y4 L% t* b& G8 b2 {
  18. //监听WebSocket连接关闭事件- ^/ g5 i3 e. f/ h
  19. $ws->on('close', function ($ws, $fd) {
      o5 D8 m0 Y% {3 F6 y( B
  20.     echo "client-{$fd} is closed\n";
    8 r9 `2 l  _( M4 x8 C
  21. });
    7 x8 P- x4 B+ c' S0 O- w* C
  22. //启动服务) p( q" C* [* s; y
  23. $ws->start();
    , k+ y6 C: c# {' L

  24. . L4 Y& Z* U, @, |
复制代码
" |  l" }' q# L) S7 q( l9 F+ }8 v' J" x
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
5 d9 E% {: _, h4 l

代码如下

  1. //连接服务器
    . v/ A" t: Q; f8 H# I
  2.     const socket = new WebSocket('ws://lm.com:9502');6 j9 B& y9 {, U) G' Y
  3.     //Connection opened
    & b( ^0 Y% g) M6 O2 P1 s
  4.     socket.addEventListener('open', function (event) {
    ; ?, T/ y5 t5 ]& l- m
  5.             //发送消息给服务器
    $ q3 I( H; B: v! l( j
  6.         socket.send('Hello Server! im websockt');8 j4 h; U& N& D. K
  7.     });
    * E0 H6 t( A, L
  8.     // Listen for messages
    ( y3 D. E0 G7 v
  9.     socket.addEventListener('message', function (event) {
    7 f6 V* I0 v0 g+ v! J4 M
  10.             //接收服务器返回信息7 P. g& P0 N3 h8 L
  11.         console.log('Message from server ', event.data);) H. o2 \& O% p+ W  _
  12.     });; @6 Q0 [  N/ P. w1 ]( m4 ^
  13. ' q, C0 O3 c- @2 c% v
复制代码
伪直播主播页面
# `% `4 p' a( v  _1 r

html

  1. <body>& `( P8 y# j9 Z1 \3 R6 I3 N
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>0 P* \$ W  `3 Y, @9 i
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">' ^$ h  b. ?, I& d# _9 s
  4.         画布
    , i! G4 k; Z# Z* \9 j
  5.     </canvas>
    $ ], `/ z* X' @: ^! ^  m
  6.     <img src="" id="videoImage" width="350" height="700">
      O+ W4 x2 G/ L- S
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    + y4 m5 h6 A, Y0 v5 Z
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    ) `$ X/ J$ R1 J' \/ C' c. [5 z( U/ L/ _
  9. </body>
    ) \, {2 g; D. L7 Y' `% ^, b
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    $ b! i7 k7 C0 C* ^0 S/ X
  2.     var c = document.getElementById("myCanvas");1 K6 H2 ?, G2 F% |" G
  3.     // var c = document.createElement("canvas");! n7 j& k! N- y3 w9 p. Q! N/ f
  4.     var img = document.getElementById("videoImage");  V8 Y/ E6 `5 l9 T2 q) w7 Q
  5.     ctx = c.getContext('2d');
    ) @5 o& G$ D; e- _0 t1 y
  6.     var dataUrl;/ u' i! x+ `' F; `2 y
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    / }# e5 P0 F, I- J* ?( B
  8.     //Connection opened
    1 @2 c5 g: }: @2 J
  9.     socket.addEventListener('open', function (event) {
    ! R6 G) ^8 j! o2 o4 ]
  10.         // socket.send('Hello Server! im websockt');4 a- m" e7 j3 m/ K: v
  11.     });
    . [7 S# E- `; u- e4 p& k! o
  12.     // Listen for messages. }! _! V/ ?- ]$ ?# V* R
  13.     socket.addEventListener('message', function (event) {
    ! K5 G5 S4 |. b) [$ e: ~
  14.         console.log('Message from server ', event.data);
    ; F4 R3 i6 B3 ~& {; o/ t
  15.         img.src = event.data;
    7 u) y: c. b5 h# H% s
  16.     });7 Q/ ]2 |$ {* p2 k
  17. . L/ P. V1 x4 O6 c- ]
  18.     function playVideo() {9 w' h. V2 E8 ~6 T2 X% S/ j
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    3 ]  ]6 f6 Y* C3 }" v
  20.         dataUrl = c.toDataURL("image/png");% T+ c, ?  V4 |, Y/ m8 ~
  21.         // img.src = dataUrl;
    % i2 L; I9 U+ O! A4 M
  22.         socket.send(dataUrl);! X5 o! {: c& F/ q# u2 c9 U7 {
  23.     }) P& ?; g7 v5 p
  24.     var tick;! B9 t# j! u# j4 O1 M1 T  h2 x9 p
  25.     function aphla() {
    : \4 R# c+ q' I
  26.         tick = setInterval(function () {: Y8 x* J4 s, h( R
  27.             playVideo();
    6 A% a) t  z2 L  n1 W1 \$ q# ?
  28.         }, 1);7 v# r, t/ i$ x& k3 L( N
  29.     }3 \* X: N* m, T
  30.     function vdStop() {- Z) [0 k$ z* q! s1 {: ^
  31.         clearInterval(tick);' ~. {. N0 {; E  a8 K
  32.     }
    ' w# R0 w. X7 z
复制代码
用户页面5 n/ N2 p/ h3 m# u/ z% y& X8 [

html

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

javascript

  1. var img = document.getElementById("liveImg");* b+ X4 l8 O0 [0 c. ~& f9 u; Z( d
  2.     const socket = new WebSocket("ws://lm.com:9502");
    " E& L. `, H  h! z8 K3 `
  3.     //
    # A; `7 e/ `- T5 X- U
  4.     socket.addEventListener('open',function(){- v. o9 c8 H. w3 p* c; D  t& Z( X, c
  5.      socket.send('Hello Server! Im live.html');
    # A( X8 |' G7 Z5 ^
  6.     });
    % o) U: F8 }" Q+ F0 C+ Q0 l5 k
  7.      // Listen for messages# ~* ~8 z' X; u/ |/ V4 Y
  8.     socket.addEventListener('message', function (event) {
    3 P! k  v0 w& J7 z3 `7 o7 X6 ~4 u
  9.         //图片地址2 c3 ]* L& o& S, f7 I
  10.         img.src = event.data;$ A  k- o, C& |6 V4 P" Z, S
  11.     });, n4 {  o9 P( [" F- P% v8 Y
复制代码

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

$ ^! z; G. }/ _: Z: }
1 r: r/ O% V* ?. E/ p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 03:15 , Processed in 0.062758 second(s), 20 queries .

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