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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    & Y$ k. Z$ n$ Y/ ?6 N& J# G7 a4 I) B
  2. //创建socket服务
    4 D- e  ~: h2 B$ z- y
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    * R" N) ^: y4 d& P- F6 C
  4. //监听WebSocket连接打开事件6 ~7 e# M( u$ v
  5. $ws->on('open', function ($ws, $request) {6 Z* {; a( q6 ?' M! E
  6.      var_dump($request->fd, $request->get, $request->server);' U; h9 t& p4 g9 q
  7.      $ws->push($request->fd, "hello, welcome\n");
    ; e  i9 Y- l1 |3 g: s- a, Z6 V: R) T
  8. });
    1 i/ O  o5 i0 M" H# v

  9. 5 v+ ^/ M1 s$ `. o2 z4 q
  10. //监听WebSocket消息事件. m% }4 N: d6 x, ^8 R- ]
  11. $ws->on('message', function ($ws, $frame) {  o* L5 \+ l* j6 Y9 F& y$ n
  12.     //推送消息给所有用户
    ; T, I5 K# x  [! ]; X3 M
  13.     foreach($ws->connections as $fd){) w2 z* e% D9 V! ^& l3 q
  14.         $ws->push($fd, $frame->data);
    9 r/ O6 K; M9 V) G' E1 U% Q
  15.     }
      Z  \# b3 G5 ^0 z3 g
  16. });
    , i5 @$ D* l8 F# ]% V& h
  17. & w! b. |, O! K: z$ ]3 n
  18. //监听WebSocket连接关闭事件
    " n1 J* C) b* J! N
  19. $ws->on('close', function ($ws, $fd) {# H& u# {( k; C7 C$ C* ]+ M6 V
  20.     echo "client-{$fd} is closed\n";0 y/ D# v$ {6 T4 Q' a
  21. });& a" Q: X8 S/ S% D, |. V
  22. //启动服务) v" E3 g, ?6 x! D& e4 z0 H
  23. $ws->start();
    0 K: s: S7 v; V# u+ I) m) ]
  24. & @1 R7 q+ ]2 h  u1 u& K! i
复制代码
8 [/ Z# l6 W4 I, E% g- B0 _
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端* ?. C9 x) R/ j8 m/ T/ D

代码如下

  1. //连接服务器/ t# z+ s! j2 J
  2.     const socket = new WebSocket('ws://lm.com:9502');
    4 G( r* u+ f% Z+ t! t8 h0 K, O
  3.     //Connection opened: ~( ^" Z4 d- y
  4.     socket.addEventListener('open', function (event) {
      U% P) }0 y" N
  5.             //发送消息给服务器
    0 t' B4 r1 m4 r6 }+ M
  6.         socket.send('Hello Server! im websockt');
    4 _2 J* U# }( X6 P3 P! r2 g
  7.     });
    3 ?  _7 n  }. w- E, A: J( k
  8.     // Listen for messages# o- X( i, b+ H- B6 Y+ f- P% o+ `; Q
  9.     socket.addEventListener('message', function (event) {! f+ Y5 v6 l) A: [
  10.             //接收服务器返回信息
    , {8 A$ u3 W2 O  T: r  T5 A
  11.         console.log('Message from server ', event.data);; A- _3 [1 ^( D8 y
  12.     });
    % T1 ?  ^- I/ l0 O; u/ b

  13. ) p" h8 \' r0 m& g4 I
复制代码
伪直播主播页面% n' |% C( b. R+ ^

html

  1. <body>$ i( X. r: r6 s4 g/ n3 K0 {
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    , q& B7 z1 ?0 [8 T8 H
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">4 g) g) e; u$ |7 o* r9 C
  4.         画布0 H* U1 B. E2 ?; h+ `) }* V
  5.     </canvas>
    ) z- A6 w* c$ `+ D. h
  6.     <img src="" id="videoImage" width="350" height="700">* l' l" ~' t! q" B' H
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>/ v4 H$ F/ ?! g% R+ k4 A& @
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>& r8 U! z2 e, X8 r# e. v
  9. </body>2 V6 L  [' S$ ]+ T- m; t( u% y5 I1 r
复制代码

javascript

  1.     var v = document.getElementById("myVideo");9 [( X4 R6 e! k2 J
  2.     var c = document.getElementById("myCanvas");% M) k; {8 r. B( H+ _+ }5 K/ m
  3.     // var c = document.createElement("canvas");
    , h! f- _. J  u! u7 |8 ?
  4.     var img = document.getElementById("videoImage");, z% z7 p) p8 g' I7 X0 X' l
  5.     ctx = c.getContext('2d');& k$ k+ `6 H5 s" @7 y# A
  6.     var dataUrl;$ v  D6 q: I& g! A- Y2 n7 I
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    , R2 S1 B% x5 x8 `; p1 O* d  h4 l
  8.     //Connection opened; c2 T: n( g) A: F8 R
  9.     socket.addEventListener('open', function (event) {: S' t: c- ~9 g7 _' d. ^
  10.         // socket.send('Hello Server! im websockt');
    1 l" b( D7 n1 R- ]% B
  11.     });
    " {! }( y/ @- o2 n
  12.     // Listen for messages1 `+ w* J& B% E# S: i
  13.     socket.addEventListener('message', function (event) {7 r! R" k& \+ h% k. C
  14.         console.log('Message from server ', event.data);5 b/ F: `9 a2 Y$ }3 h/ }
  15.         img.src = event.data;( s9 H) N' N3 e' ~
  16.     });
    3 E) w& m# U% X8 }. [) V

  17. + |. r5 F2 X$ V
  18.     function playVideo() {7 M3 X$ `, W0 o" L# ^1 W
  19.         ctx.drawImage(v, 0, 0, 350, 700);! t# f% z; T8 T( N6 E7 f
  20.         dataUrl = c.toDataURL("image/png");
    * b; B; m/ w0 A2 R( C0 D: k# a
  21.         // img.src = dataUrl;" Q  Z+ h% L7 O- a7 H- H
  22.         socket.send(dataUrl);2 ?. b" z. h6 g
  23.     }
    ; B0 Y9 p0 Y4 I
  24.     var tick;# E: m% L* C+ V+ M' w
  25.     function aphla() {
    , }4 ?) \% a3 P+ F; ?5 L
  26.         tick = setInterval(function () {
    4 D4 }0 B' d9 q  f( i7 K
  27.             playVideo();
    3 Z( ]( {" G: D1 h& R- P0 {* m, g3 @
  28.         }, 1);
    # f6 l0 J* v7 W1 C+ S% l5 F
  29.     }, b1 U2 F) z' M1 ?0 H, u# X
  30.     function vdStop() {: o) Z+ P6 U2 V- M6 g
  31.         clearInterval(tick);5 E4 k# N3 `) W
  32.     }/ F9 W" q3 u& P5 F" d. U
复制代码
用户页面1 Z1 t4 Y* ~3 s: Q" Y, I" Y* `

html

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

javascript

  1. var img = document.getElementById("liveImg");
    0 x( Y% a8 t5 z" h. Y% U" V+ B
  2.     const socket = new WebSocket("ws://lm.com:9502");' L  g! E4 q+ s& t+ t3 I
  3.     //5 D% t7 H% M" d  n" q: b, s* z
  4.     socket.addEventListener('open',function(){8 ~8 \4 A% `4 b/ s9 O9 d+ r0 _9 q
  5.      socket.send('Hello Server! Im live.html');
    , h# q2 v7 j( {! r
  6.     });( N% A* l" \$ M5 g/ J4 m# P
  7.      // Listen for messages
    ) y$ h( x( U: [) a$ v6 D8 a: W
  8.     socket.addEventListener('message', function (event) {
    , P1 i2 p8 Y9 g/ q, S9 |2 D+ S% F
  9.         //图片地址
    - C- L# A' j. T6 ?
  10.         img.src = event.data;
    2 s9 G( |# s) C  \% ~
  11.     });
    ( V% V1 x0 \4 Z2 h1 @
复制代码

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

4 L% W( M4 A- ^

' A" {" K5 ]. {
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-20 00:14 , Processed in 0.055742 second(s), 20 queries .

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