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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    1 C! w% t& Q" w8 Z  I
  2. //创建socket服务
    3 m+ x. y, j. b% G) D6 J% a+ ]9 N
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    5 ?/ d5 U% K7 o! ?: B8 D
  4. //监听WebSocket连接打开事件! ~" ^& Z4 y! s8 F3 b
  5. $ws->on('open', function ($ws, $request) {
    & Q7 U6 N5 A; e4 P* m
  6.      var_dump($request->fd, $request->get, $request->server);
    7 m  j" ~8 |8 |- y
  7.      $ws->push($request->fd, "hello, welcome\n");# g1 q& N4 B: q
  8. });# w# l" U- R9 |4 B7 ?3 i% A0 \( z

  9. , y  i$ I* W: [, _1 |# ?! K
  10. //监听WebSocket消息事件, V% w# M0 J1 X2 e2 l
  11. $ws->on('message', function ($ws, $frame) {
    & Y. n7 L3 f6 n. z! `2 k; o
  12.     //推送消息给所有用户7 H$ ]) a5 E0 ^" ^; W
  13.     foreach($ws->connections as $fd){
    5 G8 ?* i1 g- i- {: C9 |9 O- l/ f4 p
  14.         $ws->push($fd, $frame->data);  d0 |* g8 p8 E
  15.     }0 E; U( |3 W& d  Y" |* S% G3 y
  16. });. d& i, z( U9 M% g6 I, S9 q3 j1 H$ i
  17. $ h4 t- d" Z6 t# k0 K& {1 V0 U
  18. //监听WebSocket连接关闭事件
    ; Y8 V$ q7 m8 K
  19. $ws->on('close', function ($ws, $fd) {- v) R9 ?, x& w$ ~
  20.     echo "client-{$fd} is closed\n";9 D5 h- U. I9 r" n; ^; |' _
  21. });  r5 }) b1 T. [4 }" s* H  t- F2 B
  22. //启动服务9 ^, t9 n) r) o% s/ p! T
  23. $ws->start();% \( V+ l' o+ N

  24. 6 E3 R/ o% x9 W0 q. Q: X- b9 j9 h. M
复制代码

/ [) e+ p" c8 T' vWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端! x( M5 r/ y2 L! Z1 l" b

代码如下

  1. //连接服务器
    9 \; _+ R- c7 H- k$ Z# e
  2.     const socket = new WebSocket('ws://lm.com:9502');% F- ^7 D  X8 B4 x
  3.     //Connection opened
    0 x# W+ f" r' J* b! t
  4.     socket.addEventListener('open', function (event) {: Q( h& O3 _& j
  5.             //发送消息给服务器
    % w9 i& f$ `; v( \+ N
  6.         socket.send('Hello Server! im websockt');2 N: r* V, A. f" p& R6 f
  7.     });" }5 F5 {& a+ q  N, K! I
  8.     // Listen for messages
    ; Y4 x; o5 q3 i: t, H1 b
  9.     socket.addEventListener('message', function (event) {4 @# x/ c9 a: N, d3 |0 P
  10.             //接收服务器返回信息
    ! E' f4 P. R7 U8 B. q. j
  11.         console.log('Message from server ', event.data);; m9 t3 \; z- o- u& U' Q  {
  12.     });2 f# v$ [& m& ?* y( f

  13. + j6 ^) Q/ \9 `) S) J6 y
复制代码
伪直播主播页面
, n/ Y( E; H7 E. X

html

  1. <body>
    & a: {8 {$ f# n/ p1 p8 M) c9 n
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>" I3 m+ Q% g/ M3 w/ B* v
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    & r5 v/ A& Q) v% K
  4.         画布
    2 L9 N4 s% {. h( V! s' c
  5.     </canvas>" N+ r" V& p! O! A. _
  6.     <img src="" id="videoImage" width="350" height="700">
    & G% d- Q* V  Y- k: A
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    , q( P: L9 o& x: F: T7 p1 j
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>/ m& s% Y3 D" ?* L) x" \
  9. </body>
    1 g3 N) j: Q0 H3 e
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    + i4 z- U+ {: C( ^, t
  2.     var c = document.getElementById("myCanvas");
    * s( g: `* K7 T/ G1 h/ y
  3.     // var c = document.createElement("canvas");3 r2 b. Q5 Z" D* h6 v% t9 Z
  4.     var img = document.getElementById("videoImage");
    & D1 m  q2 |$ M6 z
  5.     ctx = c.getContext('2d');7 H$ _, a) @9 ?2 T- d0 M" o
  6.     var dataUrl;7 H: |8 X* U0 w9 `4 v8 r. t
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    : Z* s0 _* q8 N) z' G
  8.     //Connection opened) K6 |5 H$ `! N* N
  9.     socket.addEventListener('open', function (event) {
    1 x( ~" h, L4 p2 C" M( A
  10.         // socket.send('Hello Server! im websockt');
    * U& ~1 \/ a: m* L; U3 H4 `5 g
  11.     });
    * u, p2 P& {- Q% S7 X  k, I9 B
  12.     // Listen for messages
    3 G: d4 m) h+ c6 I# b5 O
  13.     socket.addEventListener('message', function (event) {
    * r& d0 r. A7 _  a( C
  14.         console.log('Message from server ', event.data);
    ( I( z3 ]5 [4 l0 l0 w& v1 z1 R+ `
  15.         img.src = event.data;
    ; [4 Z6 g9 u5 A
  16.     });
    ! z' I% i4 \4 p0 g3 a
  17. - V+ x6 [1 J. u* c  G
  18.     function playVideo() {
    * d' c6 e4 e" R6 b5 L
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    $ u- {7 r6 g1 t$ H/ J( x! M
  20.         dataUrl = c.toDataURL("image/png");8 R$ [- N0 ?$ n$ ?
  21.         // img.src = dataUrl;, @! l- r; ]$ o$ g2 U  y
  22.         socket.send(dataUrl);7 C& v' y1 L4 {6 z9 O
  23.     }
    & D0 l1 W3 x6 z6 H
  24.     var tick;
    ' o$ Q$ k1 B# |8 X+ n" o7 r- t
  25.     function aphla() {
    : P9 U/ Q; }5 ]3 S7 i
  26.         tick = setInterval(function () {
    ) {( Q0 `. e5 N- R# m3 e
  27.             playVideo();2 t* W# u  n4 I7 d1 G- T( ^5 p
  28.         }, 1);
    : y& }1 \% O& q+ h' Z
  29.     }
    + G. P, r4 ]5 V' g% G, O! r# [1 ^
  30.     function vdStop() {! n2 N6 T6 y% Z. M  _
  31.         clearInterval(tick);
    - g1 R1 s# S+ D7 p: ^
  32.     }
    - F; o* ?! {. S! x* m
复制代码
用户页面* K, v( Y. t$ H9 f

html

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

javascript

  1. var img = document.getElementById("liveImg");% E% E$ K2 v3 \9 u% ?4 T: |
  2.     const socket = new WebSocket("ws://lm.com:9502");# f4 j# a# v9 ^( d+ l
  3.     //$ x: {' [+ m6 k# r/ B1 w  K/ B
  4.     socket.addEventListener('open',function(){* Z2 J: f% |/ X6 h9 c( T: I. ^2 t
  5.      socket.send('Hello Server! Im live.html');
    4 T3 ?2 ?2 L: T9 Q; L8 [* g
  6.     });- R: S- z2 x$ c' g
  7.      // Listen for messages
    3 f. Q' b, R( x
  8.     socket.addEventListener('message', function (event) {
    6 [5 @5 z( l7 B! S  B1 y1 o/ R( t3 r% z
  9.         //图片地址* P/ A) @: T9 T- m) \& z# W, O8 H
  10.         img.src = event.data;# \+ U  v1 g" k; S4 N6 d
  11.     });
    / n  k+ L" X7 W* w5 L) E# u
复制代码

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

. N( y' n; L6 _/ V+ _! S
7 f1 F3 F, Q8 F( U* K" h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 11:45 , Processed in 0.067206 second(s), 19 queries .

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