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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    & z( v& t% w5 I) A6 G) u
  2. //创建socket服务2 n% a+ L3 E/ N+ E  V
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);4 y; L9 ~* H8 w; k: u1 |
  4. //监听WebSocket连接打开事件
    ) N3 p0 t5 F7 H0 }: o/ K% K
  5. $ws->on('open', function ($ws, $request) {6 I# b7 O) M, f. O! w3 Q
  6.      var_dump($request->fd, $request->get, $request->server);8 X; |9 k8 }& w2 d. |3 o
  7.      $ws->push($request->fd, "hello, welcome\n");( x. D7 e5 ~6 I& o0 d
  8. });
    5 ]5 W# I& ]. T) K2 k
  9. % l2 {) w4 [1 M) w% R, x. A
  10. //监听WebSocket消息事件
    - I& \- H, H" o8 ]; W! w0 ?/ \+ `
  11. $ws->on('message', function ($ws, $frame) {. B2 e4 [% g$ c
  12.     //推送消息给所有用户/ R8 V: E+ s* T. n0 j
  13.     foreach($ws->connections as $fd){
    % }7 {/ D( r: p3 s
  14.         $ws->push($fd, $frame->data);1 x8 u  C4 X, h
  15.     }
    7 Q% X; ]' b: a
  16. });- \: \2 A( q- l  w8 }7 R
  17. # L7 ~% v  q7 w+ B0 t8 c8 p
  18. //监听WebSocket连接关闭事件* v% h; B: Y" W  p- p$ `
  19. $ws->on('close', function ($ws, $fd) {: }0 v1 x# p6 D) N: f
  20.     echo "client-{$fd} is closed\n";* O# }) v( x, {4 ^1 S: O9 A
  21. });, P- Q4 K0 i" p4 I  L# m
  22. //启动服务
    * c# B1 Q% b  \1 o2 @% v( V6 }
  23. $ws->start();
    " N# U% E0 F! n% M* Y! }
  24. # ^$ @. V1 X1 p4 }5 C7 y- m
复制代码
& @' A# o: h. [8 E' \5 S5 @0 K' x
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
0 d  z+ ?$ ~2 i% o, O4 K% @5 R0 p

代码如下

  1. //连接服务器
    & f! Z8 K# B5 B. f( k  n
  2.     const socket = new WebSocket('ws://lm.com:9502');) L! D) _' s( l1 H5 D8 {
  3.     //Connection opened4 Z& E. z7 ]* Y0 O
  4.     socket.addEventListener('open', function (event) {4 h$ c# l& o# y4 \
  5.             //发送消息给服务器( ?5 A; @* a8 J, k) N$ T
  6.         socket.send('Hello Server! im websockt');
    4 |% @- G- [3 {  `# z
  7.     });
    ( a$ ^+ w5 N2 X# s$ G
  8.     // Listen for messages
    , x$ R) v8 `" h
  9.     socket.addEventListener('message', function (event) {/ ?7 W! }4 N' S7 s' o6 l
  10.             //接收服务器返回信息/ W' N% d' o- ^, ^: o. R0 A
  11.         console.log('Message from server ', event.data);( \5 e& U. g( ?1 M7 W% N
  12.     });' U8 Z( F  Y4 e- Z
  13. ) w# b. @4 ?* G) H1 a" R1 h0 h& `" ]
复制代码
伪直播主播页面" \3 H' `+ `  v, t0 V  m

html

  1. <body>3 F( i* m% ]8 a; h$ O7 v
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    3 ]; M2 M- g" _. z
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">; w' n$ a, H4 F/ {
  4.         画布; V6 J. @- w  i" e+ y
  5.     </canvas>
    $ t9 j+ b+ s' E  p7 B0 y; K
  6.     <img src="" id="videoImage" width="350" height="700">) l- F' u6 }. A, C5 A  o
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    3 m4 L: G+ Q. c* R# H
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    " T# Q4 q$ |) @: ]# O9 d
  9. </body>
    ) }6 ~( W. d6 H, y$ z
复制代码

javascript

  1.     var v = document.getElementById("myVideo");& m9 m% V0 O; Z$ [) }) y+ _* r
  2.     var c = document.getElementById("myCanvas");/ M. G' k% M$ ?
  3.     // var c = document.createElement("canvas");9 D! _3 L6 s/ w9 [( M
  4.     var img = document.getElementById("videoImage");
    0 f- L5 E  i0 P3 g: v
  5.     ctx = c.getContext('2d');
    - Y6 q+ s& S$ v
  6.     var dataUrl;+ ]) k4 C& V! F; n7 q
  7.     const socket = new WebSocket('ws://xxxx.com:9502');" [) ^/ g* y7 z: y9 x0 Z* e
  8.     //Connection opened
    & s- v' _: A2 p* }$ k: @8 j
  9.     socket.addEventListener('open', function (event) {
    , l# c4 V% F. p5 s1 Z8 ^# Y) P
  10.         // socket.send('Hello Server! im websockt');
    0 Z+ Y# T* W+ i0 s
  11.     });
    ( J" }) t( ~0 p7 V; [" x7 d
  12.     // Listen for messages0 e+ M: w& u/ d; t  U& x
  13.     socket.addEventListener('message', function (event) {) D9 b& _5 [& ~4 N5 ?) F! A1 y
  14.         console.log('Message from server ', event.data);
    0 G! }8 @: I+ A% h# B+ ~" ]
  15.         img.src = event.data;+ w) C! I* N! [" j7 g7 T' I7 W
  16.     });
    , D9 c9 Z) M. W/ \( W

  17. 8 H* }9 w3 |+ o" }8 q8 T
  18.     function playVideo() {; p4 {: c9 p$ G+ w8 b" L( g2 ?
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    & }$ R! p7 D) w
  20.         dataUrl = c.toDataURL("image/png");' V+ c* e2 X( c2 l
  21.         // img.src = dataUrl;! J" }4 c) b4 e" }  f  f( J
  22.         socket.send(dataUrl);
    . r0 g/ j+ y" Y- H) p5 p
  23.     }4 N# q' Z9 ~, [% U: U/ _+ O4 F" @
  24.     var tick;2 k5 C6 L$ [& x: z& l
  25.     function aphla() {
    * y7 b+ V" J% D" M+ r" I. F
  26.         tick = setInterval(function () {9 D( m! g, B* |1 P' Y
  27.             playVideo();6 c4 ~" Z+ _5 V& _+ U
  28.         }, 1);
    9 j& W3 _, K! b$ a* K4 c! j
  29.     }
    / v* _% t: q# h: `" |
  30.     function vdStop() {5 ~% M. v& o% I/ d$ V
  31.         clearInterval(tick);
    7 I) z5 d: x: N/ [2 p6 B! h
  32.     }
    / y( Q% P: A7 C4 R+ N) S2 g1 ~
复制代码
用户页面& d! _& e7 ]9 V0 u( B

html

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

javascript

  1. var img = document.getElementById("liveImg");6 s/ E! P/ O3 B: g" V- [& @  L2 F
  2.     const socket = new WebSocket("ws://lm.com:9502");- N2 {/ ^  D, E
  3.     //
    ( @# Q& U' Z1 \5 K8 x8 D1 i) w
  4.     socket.addEventListener('open',function(){
    / Z$ D" ?" z2 E( b2 @* t3 }! B
  5.      socket.send('Hello Server! Im live.html');
    / R% R" N, g8 ~7 {/ X
  6.     });0 J# h1 b5 j) P' \/ Q2 A2 A5 U& h
  7.      // Listen for messages
    1 F/ J* @% ?: H0 S% @
  8.     socket.addEventListener('message', function (event) {
    & _( `( {7 U& P* I7 G; C
  9.         //图片地址# G4 Z5 V' b+ @
  10.         img.src = event.data;' p) a0 {8 `9 `
  11.     });
    & }( k7 z2 E  P, U
复制代码

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

( b5 O$ J% M4 ]5 E: T

# J7 ?; X& q: p7 o. g9 O7 N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 11:29 , Processed in 0.137499 second(s), 20 queries .

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