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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    8 o9 p/ h, F5 B$ g/ a9 d
  2. //创建socket服务) ?& a) d8 _* }  I' C6 K+ A5 X
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    , T" j- P7 S# U# E2 z6 z  E. S
  4. //监听WebSocket连接打开事件
    , W6 r! D4 O" t+ k- G% ?
  5. $ws->on('open', function ($ws, $request) {/ y0 }# C+ }1 C: V; J- ]6 s& E+ O
  6.      var_dump($request->fd, $request->get, $request->server);
    % c* y0 a" b/ L8 I4 q
  7.      $ws->push($request->fd, "hello, welcome\n");
    ; x7 W3 `+ ~( h* Y0 K" X. }
  8. });
    . p( Q, S* h2 S

  9. 4 l% ]5 X- D! g5 l7 Y: I' U) S$ G
  10. //监听WebSocket消息事件
    7 J3 W, h- j: ]7 u
  11. $ws->on('message', function ($ws, $frame) {' v5 w/ S/ `$ ^+ n8 x
  12.     //推送消息给所有用户, {3 h5 {& ?0 x3 S
  13.     foreach($ws->connections as $fd){
    % G6 m0 I, B" t. {& F0 d' [7 Q
  14.         $ws->push($fd, $frame->data);
    ! ?9 C, l- u( D5 f/ _" G) a4 o6 {
  15.     }& ^6 R  b' z) w7 Y  [6 B; h
  16. });: l; A( f( x, u8 z5 a. B1 |
  17. 4 j! m" R) H' K% \
  18. //监听WebSocket连接关闭事件% O6 _( M* }! @( l/ F4 V2 d
  19. $ws->on('close', function ($ws, $fd) {- D- [& @/ {) q  T6 J' n  ?/ x  f0 e
  20.     echo "client-{$fd} is closed\n";/ @! m8 c1 r/ Z. L- t
  21. });
    ; X8 u7 B* c  u
  22. //启动服务
    * F/ @/ I7 Z# [3 l+ r6 q8 j( h
  23. $ws->start();
    7 H- m2 e5 {3 e7 Q) c

  24. & P( T# _7 Y, Z0 B, R& K
复制代码

$ z3 y# a9 e' OWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端2 X! O* M/ e0 t+ U+ j; [

代码如下

  1. //连接服务器
    ; |5 A/ }1 \) u, C
  2.     const socket = new WebSocket('ws://lm.com:9502');( n9 w1 ]8 t/ s# I9 J
  3.     //Connection opened( M* b/ N4 H. o/ H; J- t% @( \
  4.     socket.addEventListener('open', function (event) {  [. X* y. r8 j/ R1 z7 ?5 `# N
  5.             //发送消息给服务器
    & B7 h# v2 v7 N( }4 l/ g# y
  6.         socket.send('Hello Server! im websockt');3 M4 a. t6 B8 b. p7 ]* m
  7.     });: s2 ^7 }- g; P% r1 H+ i
  8.     // Listen for messages4 @, B% e+ |+ P* t$ o4 ^" v6 u
  9.     socket.addEventListener('message', function (event) {$ ~. z& Y3 j. r3 b4 L: L6 G) f: q. O
  10.             //接收服务器返回信息
    3 Q/ u( [+ t' t5 h2 b
  11.         console.log('Message from server ', event.data);& l# k. w6 ]5 n) P) B- g
  12.     });
    # x% g/ H8 ^8 }0 X1 K+ e* s  I

  13. 4 t1 N9 f$ C9 j5 R% N8 ~
复制代码
伪直播主播页面
" o+ s" s( f4 X

html

  1. <body>& x- S, Q$ {1 m
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>) r! P* S3 o& e" y3 Q
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">( ?) j' H2 o5 g; m
  4.         画布9 A9 a7 l; o0 z6 o9 n! F
  5.     </canvas>
    7 i: Z. N- R. e# Z+ x
  6.     <img src="" id="videoImage" width="350" height="700">/ d1 ^& l' O. A/ G6 R4 W; t$ ^
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    4 p- E# |9 K5 U2 O9 |
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>* p% F5 Z; q6 l; O
  9. </body>
    3 z) s- Y$ k, Y, D; x
复制代码

javascript

  1.     var v = document.getElementById("myVideo");& _* Y# y0 r' H- C
  2.     var c = document.getElementById("myCanvas");7 v9 ~- A( r" q: I. Z( y4 s
  3.     // var c = document.createElement("canvas");# y& h1 k: b+ P  b# F7 b  A
  4.     var img = document.getElementById("videoImage");
    - [6 U% q6 C0 u( d6 r
  5.     ctx = c.getContext('2d');9 s$ I6 ?. I6 g* v$ c; S
  6.     var dataUrl;
    ) V+ N, ^+ \1 R
  7.     const socket = new WebSocket('ws://xxxx.com:9502');/ B2 ?  P8 q1 Q2 Q/ j
  8.     //Connection opened* @$ e* d. F" _$ ]8 A% d
  9.     socket.addEventListener('open', function (event) {; D/ s, @, r4 u
  10.         // socket.send('Hello Server! im websockt');
      b# U1 Y6 R' j7 h
  11.     });
    7 J7 R3 e5 Y; q( K0 i2 p. |
  12.     // Listen for messages
    5 @% c. W: C/ e
  13.     socket.addEventListener('message', function (event) {0 d4 a' e+ ]* z% n' ?. e1 j! [
  14.         console.log('Message from server ', event.data);( [' v2 e( r/ W; P+ R
  15.         img.src = event.data;
    # k  p# k9 {  J' p& b0 C, B7 K
  16.     });
    3 k1 d6 U; F% N0 z5 Z1 M& g& k

  17. ) s* O) F+ q1 T& t6 T) C- S% R+ s
  18.     function playVideo() {
    & D+ u. b3 F( D/ {$ E
  19.         ctx.drawImage(v, 0, 0, 350, 700);
      |+ Z2 j. U1 v# s& S- w$ a
  20.         dataUrl = c.toDataURL("image/png");
    $ D2 D" p, m' d8 ~, k8 L
  21.         // img.src = dataUrl;
    ) Y2 o2 R1 c+ O6 v% l+ }) c9 {1 b' t
  22.         socket.send(dataUrl);
    / _: ?2 g+ e/ c  l6 C7 W" Z
  23.     }
    ) l1 `# g  z& a# _& Q- c7 R8 w
  24.     var tick;& z+ a8 k% x# V% R
  25.     function aphla() {, @' q. @$ O! F6 U% ]$ C. ]  |1 ?
  26.         tick = setInterval(function () {+ h* q& _( L- \
  27.             playVideo();8 }" v! O  [) Y7 O! Y4 Y
  28.         }, 1);6 |# q! h* o' q
  29.     }! S- R& m+ a6 m2 S3 s0 d8 @
  30.     function vdStop() {
    , m' @$ Y  Z: R! [; k
  31.         clearInterval(tick);0 ^, r7 e( U! f  @: Y
  32.     }$ n# Y0 u1 O' T- `4 _
复制代码
用户页面$ a% ^: \& w: ~" l5 ?! j

html

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

javascript

  1. var img = document.getElementById("liveImg");* @4 f  @$ V% L- h/ z+ C
  2.     const socket = new WebSocket("ws://lm.com:9502");
    5 D  ~8 D& c+ Y% G, o6 r/ a
  3.     //
    : f0 L' Z% y: r( q6 }' T) Q! s
  4.     socket.addEventListener('open',function(){
    / A' N3 l8 s9 a# w$ }6 P9 [
  5.      socket.send('Hello Server! Im live.html');
    6 q$ I, M6 U; E4 L. ]5 H
  6.     });
    ' l0 v$ L/ T- o8 L/ {
  7.      // Listen for messages  D; \) _2 }+ {* f9 R
  8.     socket.addEventListener('message', function (event) {* N! T- J- Z( W3 o4 v8 m5 A
  9.         //图片地址7 [+ q, l1 _+ `% b7 W
  10.         img.src = event.data;
    0 B0 a9 d8 S& m7 \* `' X8 K: e- O
  11.     });
    % w2 l6 @6 e7 \. ?
复制代码

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


2 b. m2 N2 e8 c: [' T$ o7 V+ D* w6 P! k/ J& x1 l0 B7 d9 j1 I3 v
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-22 04:10 , Processed in 0.070073 second(s), 20 queries .

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