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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  1 ]! m8 x3 _) S- H- V
  2. //创建socket服务
    6 G$ U' M' j4 E+ ]
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);2 V$ L/ v1 I4 d+ Y" x0 n9 F: y
  4. //监听WebSocket连接打开事件) M8 {1 e; v! Y6 ^5 H, d3 y9 q5 f
  5. $ws->on('open', function ($ws, $request) {# L# V; D# W/ Q+ M4 a* }6 c
  6.      var_dump($request->fd, $request->get, $request->server);9 K6 j3 h! B. l" ~
  7.      $ws->push($request->fd, "hello, welcome\n");
    ( _% P& U) t  ^# g
  8. });
    ) ~3 E5 [: z1 u$ g6 j
  9. ( S, l' W5 p, b( W0 {7 `
  10. //监听WebSocket消息事件
    ( F! ?% v, o% P5 b) H$ z
  11. $ws->on('message', function ($ws, $frame) {1 R0 j1 i3 |5 g/ i
  12.     //推送消息给所有用户4 g/ A9 X# Q. a
  13.     foreach($ws->connections as $fd){
    % f* f, b$ Q. x
  14.         $ws->push($fd, $frame->data);( [& |) Z" \: h
  15.     }& i$ ^7 @' k# n$ F
  16. });
      }8 W. _% p! z5 J2 ^' S4 v

  17. & f& F3 y: h  n" N5 E4 f3 Q. a
  18. //监听WebSocket连接关闭事件
    - r: R5 _1 L$ e6 r+ Z. F! o. J: i
  19. $ws->on('close', function ($ws, $fd) {
    4 V! V# o" w* l, x
  20.     echo "client-{$fd} is closed\n";8 y& b- h, H. i4 l3 O' N0 {
  21. });: u. D! l6 i/ h' }1 r9 ?  i
  22. //启动服务* m7 V" }6 E. h/ n$ I
  23. $ws->start();1 ^" ^7 B) `/ z
  24. 3 l% s! u; n( f- m, v( D! E  B
复制代码

  }. |& O* [/ c# g; Q" MWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
5 [2 \- j8 l% n, D& b

代码如下

  1. //连接服务器
    + F8 O' L! K2 |0 }
  2.     const socket = new WebSocket('ws://lm.com:9502');1 B1 N; q- s4 L- ]- z/ ^5 r/ H
  3.     //Connection opened5 A4 T+ j3 ^" L' O. H
  4.     socket.addEventListener('open', function (event) {
    6 N  G0 p/ a- ~  K) ?7 g2 N
  5.             //发送消息给服务器
    2 @, T5 s, z* @* a
  6.         socket.send('Hello Server! im websockt');7 s* s" K& V+ v' Y% ^7 Y: @, r- V
  7.     });( f, Y1 p! g+ C  P
  8.     // Listen for messages
    9 Z: A0 e% l; ~6 W" ~
  9.     socket.addEventListener('message', function (event) {
    & ^$ V/ B) {- Z( O- Y# P' m( `- J
  10.             //接收服务器返回信息, a6 b; i6 n: B- b! b, g) A
  11.         console.log('Message from server ', event.data);
    1 Q5 }) h- _8 N! n7 D' @$ i
  12.     });; {  n; r& r* t) y
  13. , H. M, I0 r: J) o6 I
复制代码
伪直播主播页面& _- _, B0 m5 K# o2 v9 o& O2 E

html

  1. <body>
    % E* m" e# z  H$ j1 {; D& H
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    - t; M  m5 z, h: c% f5 c8 m1 L; q9 s
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">8 a4 F6 D" T* ^) V5 F
  4.         画布5 {' F. F* d/ l/ U- c8 j
  5.     </canvas>: M8 D2 x  |( Y
  6.     <img src="" id="videoImage" width="350" height="700">" [, @9 ]6 h1 Y
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    % P0 c& A1 J6 f* I- t
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>- A' R4 Q6 t$ B: Q6 T) ?1 R
  9. </body>
    1 E  Y$ k: g8 @# ?6 U2 u& d5 C- S3 C
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    4 `, W. B0 S8 ]% \% Z3 V; \
  2.     var c = document.getElementById("myCanvas");
      u' A0 a9 n4 Z3 g
  3.     // var c = document.createElement("canvas");1 {4 Y" F$ P5 D8 L5 q7 @6 |. c
  4.     var img = document.getElementById("videoImage");6 ?/ `: f4 ~5 Y/ W: H/ S
  5.     ctx = c.getContext('2d');
    ; y2 z7 M- Z7 v$ ^( X: @
  6.     var dataUrl;
    " K2 S  x) b" ?, T4 e! h' U  b
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    9 r) `" z  _  J4 g+ v& H+ H( m
  8.     //Connection opened
    4 u' E' `1 U4 g( R3 Z8 m, W
  9.     socket.addEventListener('open', function (event) {
    2 D. N( f( Z9 k* ?# q0 k( T  [
  10.         // socket.send('Hello Server! im websockt');
    / {$ B+ N$ G) T/ f
  11.     });
    0 B, [' l, q: ~- A, A8 k
  12.     // Listen for messages
    5 y5 \; g9 k. Y
  13.     socket.addEventListener('message', function (event) {9 C% Q" z* @) H0 P2 U. Z7 ]6 {6 g
  14.         console.log('Message from server ', event.data);
    : k; K* l& X' @1 G6 O; h, I
  15.         img.src = event.data;/ K9 t% @* u- R9 M0 ]
  16.     });& E* M2 K2 h* r+ D0 Q
  17. : ^" L, l8 _4 B" Q* S( n
  18.     function playVideo() {
    9 A$ C, P1 u1 B  t/ s# ~! [/ A: k
  19.         ctx.drawImage(v, 0, 0, 350, 700);: t- ?2 }% d4 N2 V
  20.         dataUrl = c.toDataURL("image/png");3 d6 `$ \0 ~# d6 ~5 @& Z) p
  21.         // img.src = dataUrl;: h! O3 ?2 ^  y3 k" E6 J  F
  22.         socket.send(dataUrl);: b  r% B" L/ T, ^( L$ S3 p
  23.     }
    3 W2 i, \9 B9 r0 R
  24.     var tick;
    # `( `1 v6 f7 t; Q
  25.     function aphla() {
    6 q: V9 z. C# _; \( e' C
  26.         tick = setInterval(function () {
    9 F. F2 v% V7 r) J: K
  27.             playVideo();+ q7 U: R* N& z
  28.         }, 1);% j& j- N. w# [' c# w/ [( i; c
  29.     }9 p1 ]2 ]5 f# j( ?
  30.     function vdStop() {! ^  ^; i. d2 }
  31.         clearInterval(tick);
    7 u, Y* D& ~9 j+ }7 K
  32.     }, \: ?2 |, k8 L- {+ w
复制代码
用户页面
4 _- G$ y! x4 m2 ]; s8 y

html

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

javascript

  1. var img = document.getElementById("liveImg");$ y  q/ X$ i* e. t  T* A
  2.     const socket = new WebSocket("ws://lm.com:9502");
    & E9 h/ n) R8 Y4 Q% o# e! a
  3.     //3 {9 u: q3 ?3 C
  4.     socket.addEventListener('open',function(){( ~! n# ^+ ^1 i4 p' l2 K
  5.      socket.send('Hello Server! Im live.html');
    ) J; ~! B7 Q! e, t# x$ p
  6.     });7 b1 m( {3 u% H4 ?3 z
  7.      // Listen for messages* V, Y; h3 h( e) X+ Q, A
  8.     socket.addEventListener('message', function (event) {
    ( T3 u6 {: X. p6 Y. Y9 ^" D2 S1 D- V
  9.         //图片地址" t' \8 F# f. _9 F  F. N
  10.         img.src = event.data;4 A5 w4 ?: j* J& Y$ P/ n
  11.     });# Z  ]6 i4 I- G- n
复制代码

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


/ \; T; a  T& N+ J4 L) Y% I$ Q8 h4 C  m: g3 B0 L' o9 h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-4 09:31 , Processed in 0.069215 second(s), 20 queries .

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