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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    6 P1 ?, I2 m, _  n, p& p/ ^
  2. //创建socket服务, h0 S# G* O7 u& h% `" k( N, a
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);6 M$ _+ V- L2 x0 g
  4. //监听WebSocket连接打开事件
    1 J: I/ b' ]( h, h
  5. $ws->on('open', function ($ws, $request) {+ {7 j, N6 M. E; Q" \7 n# b$ I8 f
  6.      var_dump($request->fd, $request->get, $request->server);" z/ R9 M6 B4 \( S) X; c
  7.      $ws->push($request->fd, "hello, welcome\n");
    ) B4 Q1 e9 N  S5 d9 o' a% V
  8. });% m9 X4 Z/ a4 \' H/ N
  9. : W2 v* q; @$ N5 s! Q5 d' R
  10. //监听WebSocket消息事件7 `8 Z* L* Z1 y/ g
  11. $ws->on('message', function ($ws, $frame) {
    % F3 X/ z: S4 a& E; R
  12.     //推送消息给所有用户
    1 s" b3 l  [7 R7 f! S2 L. L
  13.     foreach($ws->connections as $fd){; Y3 P3 b% C$ x6 n+ a
  14.         $ws->push($fd, $frame->data);8 g) l1 t6 l- ?9 k) t4 ~
  15.     }
    2 }# a' y! d: F+ Q7 A1 r
  16. });
    7 r0 }! `( I" R: z8 w" M2 n

  17. , Q8 H) j& W# Q4 D6 }  ?
  18. //监听WebSocket连接关闭事件8 a2 q# v4 M; s& X9 s3 v
  19. $ws->on('close', function ($ws, $fd) {! H/ _- \4 h2 E+ C; m5 I+ U, z
  20.     echo "client-{$fd} is closed\n";
    7 x/ H: _5 c3 _1 m) W3 L3 s5 C
  21. });
    - G1 S; {0 [3 S+ D. m) m, o
  22. //启动服务
    6 d8 J. Z) {" j* c: c" b
  23. $ws->start();
    4 S' `2 Z' q$ |
  24. & T" I5 T, f0 l
复制代码

, x2 B1 k0 _3 A9 ~  y, FWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
4 E- Z) n) t: R

代码如下

  1. //连接服务器
    + k. |6 Y9 X8 u1 T
  2.     const socket = new WebSocket('ws://lm.com:9502');
    $ ~7 r3 Q$ i# @
  3.     //Connection opened
    6 S; k4 z; ^$ d- Z; G4 s7 B/ B, u6 @
  4.     socket.addEventListener('open', function (event) {! i2 |* {. m" g
  5.             //发送消息给服务器0 q# l+ n5 |8 w& {( ?. L# Q
  6.         socket.send('Hello Server! im websockt');
    ! C7 ~1 `, S- r2 e* J
  7.     });/ d% x# }% x7 m
  8.     // Listen for messages7 m. {: [3 O% q- E; j$ [" Y
  9.     socket.addEventListener('message', function (event) {
    , T4 t4 f2 J3 t$ w! A- j4 G6 i7 R
  10.             //接收服务器返回信息
    % A  q% C5 n; R) k6 H
  11.         console.log('Message from server ', event.data);* V6 J# o; a9 \# q5 N: w" l; b% U
  12.     });
    ) d; ~' \7 H- D0 K5 a! _
  13. + Z% p5 |9 i; c
复制代码
伪直播主播页面
6 E3 q6 F7 o1 y; s( z& x/ A

html

  1. <body>
      g7 O5 K* `! {. J+ L/ {
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>6 q! }) ]  R% n4 N" j: Q
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    : f5 E6 U. z. s) ?7 b: \# F6 N! Q2 ?
  4.         画布
    ' `- C! \# V& ~/ a- H
  5.     </canvas>! T# d+ V: ?* b4 g
  6.     <img src="" id="videoImage" width="350" height="700">* E: o( B$ v/ y% T2 B" j  V# A
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    - P, I, ^: h" o& b' C$ w8 J9 n( D
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>9 v- u) Z/ N* k; \+ L% A( w( E
  9. </body>
      B$ d. M3 m7 a! y) C
复制代码

javascript

  1.     var v = document.getElementById("myVideo");  \  ]6 N1 Q3 R
  2.     var c = document.getElementById("myCanvas");
    / ]( ]- ?& q/ |  t
  3.     // var c = document.createElement("canvas");7 {+ @  a: f' R. w& t( L' A8 [
  4.     var img = document.getElementById("videoImage");
    2 L, W2 Y( k! d. y  q# B( D
  5.     ctx = c.getContext('2d');
    0 Z: z& T; O1 T+ ~2 d2 Q
  6.     var dataUrl;
    : V7 l/ j5 y* r5 |$ Z' L( l
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    , q- `1 v% }* j& f
  8.     //Connection opened. I% b7 o! I1 J* L* f1 `
  9.     socket.addEventListener('open', function (event) {1 W3 O. Q6 ]2 y  K4 W' V
  10.         // socket.send('Hello Server! im websockt');* S5 U2 B1 }6 B. I
  11.     });
    9 ~5 g$ Q0 U' i4 g  i; M6 F5 P
  12.     // Listen for messages6 [' j% h0 l+ ?# ]" S5 J( U
  13.     socket.addEventListener('message', function (event) {
    8 F6 ?& s# m/ u4 |' S9 p
  14.         console.log('Message from server ', event.data);. @- |6 S4 K! U5 O" r% [- O9 o
  15.         img.src = event.data;+ `9 X4 g9 r7 q# q/ }
  16.     });+ L6 g1 K; a' {  u
  17. 1 J. B/ {" U% u- T. o6 o
  18.     function playVideo() {5 I4 t; D3 I  R! ~0 W9 i  q* C
  19.         ctx.drawImage(v, 0, 0, 350, 700);1 v8 z# ^3 R: P% K
  20.         dataUrl = c.toDataURL("image/png");
    ! I! x; k- w1 h. T4 P
  21.         // img.src = dataUrl;
    ' J: }' x3 c3 w% k' W$ w$ n
  22.         socket.send(dataUrl);7 E" D, O' L9 f; D" T* w, Q; a
  23.     }
    / e1 V5 ]. j7 X
  24.     var tick;
    7 t! [8 m( u9 R$ e' e
  25.     function aphla() {
    ( x1 j# x) t# y" N$ r! Y% O9 G
  26.         tick = setInterval(function () {
    + Z: [# p0 N4 _0 Q
  27.             playVideo();
    # _, `& m/ s0 v) M8 t3 w( P
  28.         }, 1);
    ' U& Y( ]5 S8 @! [; M* N
  29.     }: C% H1 J5 a( L# j) E9 u+ }& h" Y
  30.     function vdStop() {
    ) c4 i" Z% L. _) @* P
  31.         clearInterval(tick);' p4 B; D" w: P2 g) \) L, a
  32.     }* [" V4 x5 |+ |
复制代码
用户页面& y' B# h' k% A0 V3 T+ Z* Q' E. k

html

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

javascript

  1. var img = document.getElementById("liveImg");' v" ^/ W7 @7 G
  2.     const socket = new WebSocket("ws://lm.com:9502");: E9 @3 T1 e  G! v- o6 b' a: J
  3.     //# N2 S$ P$ O( L& r1 m
  4.     socket.addEventListener('open',function(){
    / v0 Z9 A8 q- G# O% Y. s
  5.      socket.send('Hello Server! Im live.html');
    . a" g8 N& C# g, l
  6.     });$ Y4 Q0 V& |7 p* c, [+ ^' o; O
  7.      // Listen for messages' @& C7 Y& a3 w1 y5 W' |
  8.     socket.addEventListener('message', function (event) {
    * l3 o& o2 V9 G# B% |
  9.         //图片地址1 u2 l! }0 i3 E5 r1 d( O3 X" X4 m
  10.         img.src = event.data;0 x& H% X/ ~5 E/ L
  11.     });
    3 `  ~5 L5 M: x! X+ h
复制代码

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


' P" ]) S- Z9 R8 `% o" X+ S! B+ m2 s" J1 n; x8 d- K
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-5 04:44 , Processed in 0.107142 second(s), 19 queries .

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