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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    , p$ x. \# c. E7 Y$ A7 G8 a
  2. //创建socket服务+ L& y: u. L6 Y/ y4 o
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    8 U$ D$ V+ A5 t4 ^& K2 Z* c) L
  4. //监听WebSocket连接打开事件
    6 }% l8 u" j5 y9 b* p- L& _
  5. $ws->on('open', function ($ws, $request) {
    4 Q$ q; x0 J% f2 f8 S
  6.      var_dump($request->fd, $request->get, $request->server);
    : O4 U7 X, L% L0 l
  7.      $ws->push($request->fd, "hello, welcome\n");' v5 B5 G/ ]8 ]! b
  8. });
    " s) |, K. P- n& d( C

  9. 3 ~! Y9 y. b7 K$ K6 M
  10. //监听WebSocket消息事件. H5 ^! J* d& G/ V/ u
  11. $ws->on('message', function ($ws, $frame) {2 C. e2 i" n8 ~1 R' @+ T- U# Q; X
  12.     //推送消息给所有用户* q  u8 g% Y" x* j- ~" U+ \& ^$ B  Q. o
  13.     foreach($ws->connections as $fd){; {. {* d8 `/ I$ v, F9 r
  14.         $ws->push($fd, $frame->data);
    6 r6 i6 H  `2 F( J, U
  15.     }
    7 v9 j& @" [  x$ x) c) k
  16. });
    9 g5 \4 a+ C' e% Z0 `4 c

  17. , y+ O2 `% M" l5 b$ s$ h8 V. G0 f; ~
  18. //监听WebSocket连接关闭事件
    9 v$ s9 x, b& b/ m" n
  19. $ws->on('close', function ($ws, $fd) {
    * b" I3 ^8 r0 H  L! r
  20.     echo "client-{$fd} is closed\n";, K7 a: T" O4 D; K3 B( N+ n: C* z
  21. });
    * {1 [# ?6 `* [+ [' I1 R/ P5 I
  22. //启动服务2 j8 ^3 T" b5 n; p+ ?/ N
  23. $ws->start();
    " W  R. [) P- F) n
  24. + x8 b2 H0 O: U' a( ~1 O
复制代码
" m' q" ?8 ]" q! I- h. \
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
0 y0 L; a- C' h& E. y2 t

代码如下

  1. //连接服务器' w% L. q- @5 C2 C7 f; U# t
  2.     const socket = new WebSocket('ws://lm.com:9502');6 |- ~" H: q: k& t6 n# N3 X1 y1 p4 H
  3.     //Connection opened/ o. f- j! c$ E& V9 S3 B
  4.     socket.addEventListener('open', function (event) {! L; W' v; R$ j& Y6 S- P. x
  5.             //发送消息给服务器3 Y) a/ a2 c% Z& ~" T
  6.         socket.send('Hello Server! im websockt');9 D4 A% a* n3 b" V
  7.     });1 L! ]2 V& J5 ]% m" n5 y0 f
  8.     // Listen for messages
    & C/ V- `2 b! r7 G6 t5 ~8 s
  9.     socket.addEventListener('message', function (event) {: u' B$ o$ C* l& c! @& p: i
  10.             //接收服务器返回信息, H# T' T" K! [6 D3 E1 B
  11.         console.log('Message from server ', event.data);
    - ]9 l3 A" ]" E% j9 j
  12.     });" g2 _8 ]+ U. I3 X
  13. ' Y- j, ^. }5 K6 ?. Z
复制代码
伪直播主播页面
! [" _7 u* _; N( U1 P

html

  1. <body>! m- m* ^* m5 n& F: z, }
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>6 p# a6 V% b5 E% b4 _
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
      u1 a% {( o  r- P/ h$ ?/ U
  4.         画布3 d) o9 {! k% N/ C
  5.     </canvas>
    7 o3 P7 ~) d( V; {. |
  6.     <img src="" id="videoImage" width="350" height="700">
    & y$ M) v1 n8 e( ]
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    ! {$ d6 ]) Q& C
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>$ A3 S" R+ W  w7 I% i
  9. </body>
    # N+ ^9 s+ m# |7 A6 c/ E) ~* q6 ~
复制代码

javascript

  1.     var v = document.getElementById("myVideo");( z9 H) q: ?1 u7 n" @1 h3 ~' ~
  2.     var c = document.getElementById("myCanvas");
    4 X: ?- P4 ?+ [
  3.     // var c = document.createElement("canvas");1 y" |( X; g, L* c' X6 Q
  4.     var img = document.getElementById("videoImage");
    " }+ I; j8 c; ?" W6 V; C% N
  5.     ctx = c.getContext('2d');; F" Z; \2 @8 p9 X! v! P
  6.     var dataUrl;7 G1 ^6 G- [! O# d( c% L
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    # u6 X. c; ~+ ^$ z$ W
  8.     //Connection opened
    1 N" ]* U! g9 P! T: d
  9.     socket.addEventListener('open', function (event) {. n' S) o$ N8 B. Q  L4 d5 t
  10.         // socket.send('Hello Server! im websockt');7 b: M- w6 h' f; u& ^. s
  11.     });6 D! V6 J$ ?0 u5 I- h& I
  12.     // Listen for messages
    ; t1 {2 c* h; j( I3 ~% k
  13.     socket.addEventListener('message', function (event) {
    8 b  I5 {3 ^- t4 n( i* ~
  14.         console.log('Message from server ', event.data);# w) C7 y# w! K1 u. h5 }
  15.         img.src = event.data;, `+ ^9 v/ m7 i
  16.     });
    4 L0 o' J$ q& z* b' x

  17. 7 D. R# v7 a3 F8 B3 D
  18.     function playVideo() {& P) r/ d) M$ }) S
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    ' @  F$ F) D1 `' @3 z  L
  20.         dataUrl = c.toDataURL("image/png");- o6 t0 y- Q7 c% P( j, \( g! N* J
  21.         // img.src = dataUrl;
    5 X4 [6 d; m: ^& @9 H4 x& M: L
  22.         socket.send(dataUrl);9 t- Q+ M3 _/ m
  23.     }
    , ~( X* Q0 L, M+ {( ]; u7 e
  24.     var tick;
    + Y( f! q4 Q( M! D/ c( |
  25.     function aphla() {
    ; N# \5 a2 {  @$ R
  26.         tick = setInterval(function () {
    # B1 W6 f# I7 @0 i* p9 `
  27.             playVideo();- v/ V7 ]; d1 ^3 a
  28.         }, 1);& U# T! j" J! F
  29.     }
    * ]' v5 Q+ U" R: u! t
  30.     function vdStop() {0 t5 b( j" G/ x; Q
  31.         clearInterval(tick);
    1 R/ k8 n/ ^5 D3 h
  32.     }8 a( p3 P! ]4 o( m1 {$ J
复制代码
用户页面# T% f) B6 ?, q6 `/ `' s) p

html

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

javascript

  1. var img = document.getElementById("liveImg");
    ; r4 ]+ F. Q9 H/ g0 t( e  A7 O- {
  2.     const socket = new WebSocket("ws://lm.com:9502");
    * A3 X" \0 ^# ~' C
  3.     //
    6 E' k: ~# H( I/ D7 {
  4.     socket.addEventListener('open',function(){
    ) |, y7 I% S. X
  5.      socket.send('Hello Server! Im live.html');
    % y/ Z  |  b4 y3 O: D2 `
  6.     });
    ; z' V7 ~9 M) \. u# \3 w
  7.      // Listen for messages6 f3 Z9 E% m' Q# \; E
  8.     socket.addEventListener('message', function (event) {
    ! C0 @1 t% |1 q/ Y( F, z
  9.         //图片地址0 l* j  v8 D+ _! u4 Q7 E7 S
  10.         img.src = event.data;
    4 i: |! e1 k) J9 F+ l4 T
  11.     });9 Z. t8 G& O$ U" y3 G% _
复制代码

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

/ T$ j! p' q( j8 z$ j6 q

: a- |7 ~6 J4 b, E
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-19 23:30 , Processed in 0.104546 second(s), 19 queries .

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