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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    3 x+ V( W; t/ V
  2. //创建socket服务6 m9 z  `) W: F+ a1 i/ _
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);, G8 m  K6 r  G# b: ]! j. Y' d- I
  4. //监听WebSocket连接打开事件
    : Z  p2 ]+ l; A* \+ D
  5. $ws->on('open', function ($ws, $request) {4 W+ W0 Y4 X) }0 ^
  6.      var_dump($request->fd, $request->get, $request->server);
    / a9 }; w8 [4 V1 S- C) a
  7.      $ws->push($request->fd, "hello, welcome\n");
    / j5 N- d+ Q, t7 L5 }  o) [% Z
  8. });5 Y' \2 X/ _" T0 y! H6 |" R

  9. 5 f# u4 N* `+ v) S! g
  10. //监听WebSocket消息事件
    ( N2 n, L( `  q  i0 N
  11. $ws->on('message', function ($ws, $frame) {
    ' ~, o: Y2 O: n1 o5 c# v( ~1 p
  12.     //推送消息给所有用户
    ) N; Y+ t. ~# ]5 f) g( o9 K% u
  13.     foreach($ws->connections as $fd){* l$ K- n9 m7 G" C! v+ j& ?$ P
  14.         $ws->push($fd, $frame->data);
    % f% w" I$ _2 w+ a
  15.     }: o8 r7 ]/ M: ?7 O
  16. });4 I# @0 d  `' _3 H, U7 T
  17. ) n: h$ Y+ \9 z- [0 m, S& Q  d( i( [
  18. //监听WebSocket连接关闭事件1 j% Y& v3 S1 R. c
  19. $ws->on('close', function ($ws, $fd) {
    / J+ k  x# X% T
  20.     echo "client-{$fd} is closed\n";4 \) n: i* R0 ]* N% R9 N2 A( b
  21. });
    - K/ P) d+ p: A! P2 K
  22. //启动服务0 I, R! p) r- s6 L, M2 T
  23. $ws->start();+ R5 k9 D% t4 b, U7 `

  24. - K; l* h1 i0 r5 q# Y
复制代码

0 V# z' w9 Y: z( TWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端% g! O. W2 O2 q5 ?6 J4 M6 H4 ?

代码如下

  1. //连接服务器4 B5 O* e' }, U+ p8 J% Q
  2.     const socket = new WebSocket('ws://lm.com:9502');
    $ ?( ^. Z  r8 j$ Z* b
  3.     //Connection opened6 [/ p) I3 O# j+ a1 c, X
  4.     socket.addEventListener('open', function (event) {
    ! P  {4 Z9 \8 e* m
  5.             //发送消息给服务器2 S# |) l& T& X* \  ?
  6.         socket.send('Hello Server! im websockt');
    7 R# r4 a* l% ]
  7.     });8 @- B: W/ U3 i" o
  8.     // Listen for messages, ], b: ]4 y& |4 n6 Z3 U6 ~
  9.     socket.addEventListener('message', function (event) {) `% R  l" X3 {5 F% L* D5 ^3 f
  10.             //接收服务器返回信息
    7 O- B, u  q* M$ V
  11.         console.log('Message from server ', event.data);
    9 m; V8 q4 T2 G% `
  12.     });
    6 F. w% _  i6 o5 |; O& N0 Z- Z

  13. # D$ i5 G6 e1 k0 \
复制代码
伪直播主播页面
7 q0 ]: b& ~2 e8 Y0 D7 n, u

html

  1. <body>
    / s. ?7 F9 p% h5 P, T
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>+ R1 r6 m) @9 t% B' Q* g6 u( n
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">$ `$ y( ~% T( U  M6 w4 Z, ~1 R7 ~0 @
  4.         画布
    6 d+ J2 t8 r% ]' i8 r. T
  5.     </canvas>
    ' l+ P& l! \. @% H/ ~
  6.     <img src="" id="videoImage" width="350" height="700"># a  X  |) n( r1 ~, o+ ~
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>0 i' {" `; v5 Q8 O. y0 z0 C/ t
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    7 b! O4 @, Y2 Z0 `
  9. </body>
    - ~4 F1 [9 ]: m' }( b
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    $ f* }8 U) j/ e: Y+ ?7 ^# C5 r. \
  2.     var c = document.getElementById("myCanvas");
    " H. m" C9 ^0 K: l! R2 V
  3.     // var c = document.createElement("canvas");" X- ?' R2 l0 o
  4.     var img = document.getElementById("videoImage");
    : ]4 @2 F1 y: G& \- ]/ C9 }
  5.     ctx = c.getContext('2d');
    2 p, x, Q/ H- n
  6.     var dataUrl;
    # S' q, J; j" p. R1 P5 [
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    , z* Q7 ?; a5 Y" d' f" ]7 O- R( J8 z1 o
  8.     //Connection opened
    3 h2 ^* f4 I, T
  9.     socket.addEventListener('open', function (event) {
    4 @4 n0 u6 F1 S4 M; G) G7 q- z
  10.         // socket.send('Hello Server! im websockt');( W6 Q3 I" L  y
  11.     });' ~  p$ J" ^/ K) b, S
  12.     // Listen for messages+ u5 l( O1 G5 u. ]
  13.     socket.addEventListener('message', function (event) {
    + J: O8 l+ S/ X- t
  14.         console.log('Message from server ', event.data);/ Y% W9 D+ Z# g' _* f) O
  15.         img.src = event.data;
    / U/ X3 ]  f1 Q, G4 Z
  16.     });; i$ h) i2 ~7 Y  [3 L* F0 P0 f
  17. % r+ I6 z- N2 e- A$ d
  18.     function playVideo() {
      b+ D0 _- I; K; \# ^/ d
  19.         ctx.drawImage(v, 0, 0, 350, 700);, W% [. I( k8 f$ b0 W0 H. M
  20.         dataUrl = c.toDataURL("image/png");$ L0 w; d; n" Y5 L  z
  21.         // img.src = dataUrl;5 O1 ]9 V, ^* H" O: q: Q, ^' x
  22.         socket.send(dataUrl);6 K! M0 |$ J8 k: J/ C3 @; P
  23.     }
    5 \8 F3 I. j' D
  24.     var tick;6 e6 l2 |2 d4 R  u1 W/ f7 q! K$ `
  25.     function aphla() {
    5 T. V, Z) A. \. S
  26.         tick = setInterval(function () {
    ( A/ k' t6 ?) Q  T! v
  27.             playVideo();
    - A/ ?7 \( Q( @
  28.         }, 1);- G. k9 [. H% Q0 K
  29.     }
    + B( ?$ h7 P' V- U
  30.     function vdStop() {1 Q8 ?( |7 ^5 _1 \7 G; R! j
  31.         clearInterval(tick);9 X4 [+ Q9 A) Q
  32.     }: F0 b# Q( I8 d1 [
复制代码
用户页面+ F" F6 S+ H! U" o

html

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

javascript

  1. var img = document.getElementById("liveImg");& [) g2 z; g; [- z- a6 V
  2.     const socket = new WebSocket("ws://lm.com:9502");* n3 g6 F* v8 F' o; S+ z
  3.     //
    ) k9 l- V3 V! m; P# T
  4.     socket.addEventListener('open',function(){( S* i% x: _; J0 O' @6 s+ Q% H
  5.      socket.send('Hello Server! Im live.html');
    8 @' J6 y8 {: h- p/ Y, Z
  6.     });
    0 K. j/ P$ h$ v
  7.      // Listen for messages& y9 m9 D6 Q6 e/ h7 s: D
  8.     socket.addEventListener('message', function (event) {
    5 B" D1 J: b# S$ I. p5 _
  9.         //图片地址
    2 x3 }4 G; H" Q7 o) V
  10.         img.src = event.data;6 s' o% a$ s; a3 S( v) g  \
  11.     });
    + c  g2 J# Z. v$ T; O
复制代码

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

# ~* a) j& H, B# w8 G8 G2 ~$ ~

. j) @) c; Z, @" A
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 16:06 , Processed in 0.051816 second(s), 19 queries .

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