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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    ; Z. l5 c- n: P  ?% T
  2. //创建socket服务; s6 C9 Z3 p- J* g2 [. s# B
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    9 Q8 l5 v$ P1 w* Y, e" a
  4. //监听WebSocket连接打开事件. d. L6 A( `$ U" b% ?' o2 p, a$ D1 t, |7 R
  5. $ws->on('open', function ($ws, $request) {, j6 Z$ ~8 L. Y6 [; G: j
  6.      var_dump($request->fd, $request->get, $request->server);. T1 F" G, ~/ }5 M. ~* X* c; `
  7.      $ws->push($request->fd, "hello, welcome\n");) W0 g# l% |9 @" K
  8. });# C* e1 Q$ W1 Y) r+ w

  9. * i  a6 z3 _4 @4 j0 @( J
  10. //监听WebSocket消息事件( m4 H7 Z" v: A$ q3 G
  11. $ws->on('message', function ($ws, $frame) {
    ) t4 t+ [, x9 e; l
  12.     //推送消息给所有用户# i& G' e) D9 s" ?  M
  13.     foreach($ws->connections as $fd){
    * }% ~1 ?2 s: q% {- K
  14.         $ws->push($fd, $frame->data);( T; i( l1 X; O
  15.     }& O; A7 b. E2 {/ X( b
  16. });2 Y1 d" N* R- _% A7 m9 }

  17. 0 E7 B* T+ \) m" C3 s  l& X
  18. //监听WebSocket连接关闭事件! G: V! G* }0 i& k
  19. $ws->on('close', function ($ws, $fd) {0 H& g' [+ d* O
  20.     echo "client-{$fd} is closed\n";# ]6 t" o) w# X! P! t, a! h
  21. });' O$ p1 M  |7 q
  22. //启动服务1 N: ?6 \2 I8 R
  23. $ws->start();" g) \5 p; y+ a) z( [
  24. - p  o- d# U% d0 V: H
复制代码

" `9 D1 G; |6 b5 o+ D" V6 WWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
6 r& e: C# R$ j5 I; A0 K) {

代码如下

  1. //连接服务器
    + i6 `/ v& A2 s3 c0 F
  2.     const socket = new WebSocket('ws://lm.com:9502');
    6 g" s" U0 \, o) k$ [
  3.     //Connection opened
    * y  u* |# u$ j" x  U9 z) `; n* o
  4.     socket.addEventListener('open', function (event) {
    & k# z) U+ S' p, i. ?
  5.             //发送消息给服务器
    8 I& J3 R; P, w6 H. X) P3 e' X2 l
  6.         socket.send('Hello Server! im websockt');
    5 D3 ?! ^9 o& i0 [
  7.     });
    2 U; y: t4 N" H3 u5 E
  8.     // Listen for messages3 E; P" o% t# J7 h
  9.     socket.addEventListener('message', function (event) {( d, L) C5 Z+ ], H/ b( b- V& ]9 D- v+ \
  10.             //接收服务器返回信息- ?; a1 g! D) E) N3 c% z5 e) ~
  11.         console.log('Message from server ', event.data);; E7 L+ |$ F2 G% f7 T' r
  12.     });& T2 X; \3 ^  I

  13. 1 L' x' j3 k5 t; o/ P% a+ X
复制代码
伪直播主播页面- r5 k% J& H0 L

html

  1. <body>
    5 |; V  V/ `) [7 [0 c
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
      ^) T- W& q* K$ c
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    # P+ P6 k. Z- a% l& M
  4.         画布. k2 l2 |& O* D8 z+ _6 h* D; q
  5.     </canvas>
    % F2 I5 z, a3 D0 s1 v0 j* s
  6.     <img src="" id="videoImage" width="350" height="700">
    7 w) s4 C2 F6 @/ Q; Z0 K1 s
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>: M# g2 h4 w: L: W, t: ?
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>. U1 r" b( e# d$ n
  9. </body>
    ! P0 `/ u# l. \" f6 x2 V: A" f5 m
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    6 x9 i9 m; x# f/ _
  2.     var c = document.getElementById("myCanvas");5 ]4 |! p% Y4 E; m& Z( F9 ^
  3.     // var c = document.createElement("canvas");
    . ]0 W1 k2 O: _) U" x6 E
  4.     var img = document.getElementById("videoImage");
    1 h# [/ H/ n( y. V
  5.     ctx = c.getContext('2d');
    ( h1 g2 K: \1 ^
  6.     var dataUrl;+ h$ m( T$ Y, |5 Y' L, s  ^
  7.     const socket = new WebSocket('ws://xxxx.com:9502');$ G- {; w7 H. L) {  s- V
  8.     //Connection opened/ c0 g- C/ Q+ ?6 G# W3 a2 N
  9.     socket.addEventListener('open', function (event) {4 X2 ]$ T/ z5 d5 V# n6 a6 S7 L
  10.         // socket.send('Hello Server! im websockt');- U: |: L) n  _. n% \2 V' {! o
  11.     });& }) ^; U+ K) u& i; O" r( q
  12.     // Listen for messages- x' G% T9 Z5 a8 V: J7 C5 @. Z+ m
  13.     socket.addEventListener('message', function (event) {
    6 Y7 B. c: x! H7 b6 \; }
  14.         console.log('Message from server ', event.data);0 \" U! e+ `& j! F) z2 d: _
  15.         img.src = event.data;
      B$ f% t- a! ?6 P4 g+ T9 E  a
  16.     });
    4 g0 k) W3 h$ {' y/ {9 o/ D

  17. 8 @- A7 S6 q/ y$ `$ ]; y/ b, J7 H  |
  18.     function playVideo() {
    6 i9 B  n- K/ z9 R
  19.         ctx.drawImage(v, 0, 0, 350, 700);* b! ~  x  d* f/ _! o% @
  20.         dataUrl = c.toDataURL("image/png");
    : @  [' Q- f5 L' I
  21.         // img.src = dataUrl;" g  [) ]# O9 u" l: L+ L
  22.         socket.send(dataUrl);
    . r7 M3 Y0 ^$ R" z6 s
  23.     }
    3 T+ A8 i* j5 u  }
  24.     var tick;
    - R2 l+ z0 Q( F* G9 x$ W
  25.     function aphla() {( t# b  b6 x/ d4 `3 k' M7 e
  26.         tick = setInterval(function () {$ J5 {/ t' ^; s- l  Z
  27.             playVideo();
    ) q7 ]; y/ L" k. ?9 L( l
  28.         }, 1);
    7 o+ c; i( B* k7 F+ r
  29.     }2 n8 x' F- ^* u6 U1 n
  30.     function vdStop() {( k* ^& l8 l0 a  |* Y
  31.         clearInterval(tick);
    - r6 W/ Y6 ~+ n; F6 t) V
  32.     }
    ! k9 C# G6 ]4 S4 g) T3 H+ x
复制代码
用户页面
% J! R  [+ \# T, K8 ]1 p

html

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

javascript

  1. var img = document.getElementById("liveImg");
    + Q' h2 S4 c$ e& B) C0 Z
  2.     const socket = new WebSocket("ws://lm.com:9502");( e7 r6 j& t4 @" a% B# C
  3.     //$ X& C/ g' G. O" d
  4.     socket.addEventListener('open',function(){8 C, Z0 {* w# p4 ?8 Z$ w3 L
  5.      socket.send('Hello Server! Im live.html');2 k  c3 t: }7 q" }* V* E
  6.     });
    ) ?- r7 a  }& Z; L. |# [0 ]4 _
  7.      // Listen for messages# y; ?2 `4 G. b+ z/ z; A, R
  8.     socket.addEventListener('message', function (event) {3 M- d+ o% x4 L" S% H0 n8 Z9 G7 E) y
  9.         //图片地址
    3 i" J! D$ z/ Q0 f) B7 h
  10.         img.src = event.data;
    % f' t) O, M, d+ _1 K$ Y
  11.     });
      }- X  f2 }- L) H* n  W% w
复制代码

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


* C6 [4 t, S; y3 ^! N# E9 V
% k1 ~( o/ y' D) Y* e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 23:51 , Processed in 0.059392 second(s), 21 queries .

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