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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  ! _* ]& W. V. ^6 e% e; `2 b- t8 Q' Y
  2. //创建socket服务
    : _# Y/ u5 b% U% F) v
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);2 l% C' w# t1 r' R' G3 p3 ?
  4. //监听WebSocket连接打开事件
    2 N0 B; m- D0 f8 e
  5. $ws->on('open', function ($ws, $request) {, J* O  f4 c- x( m  W1 e
  6.      var_dump($request->fd, $request->get, $request->server);* q6 [3 m( b- D5 U2 ^
  7.      $ws->push($request->fd, "hello, welcome\n");6 a6 C' o0 G. W9 B8 z3 A2 ]
  8. });! U' y, V5 w, y7 [" o
  9. - {( K  v  @6 }7 q6 n
  10. //监听WebSocket消息事件
    " L: t) Q6 o. b1 B
  11. $ws->on('message', function ($ws, $frame) {. a9 U" w- k. t) t+ y; M
  12.     //推送消息给所有用户
    # m7 I  d" T  W
  13.     foreach($ws->connections as $fd){1 P' R! o+ r; b3 c9 ^
  14.         $ws->push($fd, $frame->data);
    ( R2 P+ ]( ~# ~6 f" p. a
  15.     }
    7 t0 e' j" e* z' a. y* g8 y" h
  16. });
    ( l) T& r' _( }6 I+ ]
  17. ! p. H) p8 E1 h' q% U
  18. //监听WebSocket连接关闭事件
    $ e' R+ H2 r' I/ Z( ?6 o
  19. $ws->on('close', function ($ws, $fd) {
    * ^# R5 M* a% t: ~" s  t
  20.     echo "client-{$fd} is closed\n";+ p1 [1 _) l9 v" ]2 p/ h' Y7 g
  21. });. i( c$ m! s9 U. U! N7 `: j
  22. //启动服务
    , Z5 @; C  \$ O3 N
  23. $ws->start();
    2 ^' {* S0 I" c) y& t, e
  24. 0 j8 r- E+ Y6 B; u
复制代码

% T2 }/ `6 W& {- f( z4 w7 oWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端+ n$ s( W, H/ O* y7 u3 r

代码如下

  1. //连接服务器
    7 a+ Y" ^$ S6 j1 U, _- L
  2.     const socket = new WebSocket('ws://lm.com:9502');+ @2 O' B6 N! F; W
  3.     //Connection opened
    6 i  S: t( Q  p
  4.     socket.addEventListener('open', function (event) {- O* E. H' q& r1 v- @
  5.             //发送消息给服务器0 P7 ]# |5 O! s& D; X: D3 g7 X! ^
  6.         socket.send('Hello Server! im websockt');7 u0 C0 e; V3 {$ Z! n$ C; Y
  7.     });& g% G  i- |. o2 }% Q* A
  8.     // Listen for messages
    $ V* K4 _' j+ O- P, V
  9.     socket.addEventListener('message', function (event) {
    $ i0 S" U" D& u
  10.             //接收服务器返回信息
    8 g& @2 w: y* v+ b. Z  f2 s! E; h
  11.         console.log('Message from server ', event.data);" @8 q3 X0 x" P$ x- A! S
  12.     });  K/ N* I- g. L) T

  13. 9 d3 M; \: Y0 C0 a1 R  b
复制代码
伪直播主播页面. O5 M% c4 |0 p4 \  W

html

  1. <body>% z8 q( r/ ~. {
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    , t8 I# A2 ?* s, Z
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    ( \5 w9 x. L# a! `. b9 ?- q% S
  4.         画布
    ; Y) h8 Y2 {2 p) S, Y
  5.     </canvas>: R* z* t* `$ o) O8 z
  6.     <img src="" id="videoImage" width="350" height="700">0 v3 e. t' D0 E) p
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>! ^( C% H0 U9 z& T$ A
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    : P4 U0 z, z) m) \/ M3 k, C. I
  9. </body>
    0 V1 F" [' v3 z, L) W
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    9 b: ?( }8 y8 ]" y0 X8 o" r( G
  2.     var c = document.getElementById("myCanvas");# g  w: c+ l- Y5 n% {( l
  3.     // var c = document.createElement("canvas");+ z* b2 H* E' q& S9 m  ^
  4.     var img = document.getElementById("videoImage");/ ]0 O1 T' ?* m; U, n; M
  5.     ctx = c.getContext('2d');
    + U, m7 ^9 h  ]3 n% |2 H! Z7 Z
  6.     var dataUrl;
    " X! Y6 d/ r) O9 _+ n4 g+ j1 P
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    & V+ x) I. r2 b$ R- t3 E
  8.     //Connection opened/ k. t! m1 U0 z6 I) t
  9.     socket.addEventListener('open', function (event) {; ?5 L& ]8 I8 L( c* d5 @- ~
  10.         // socket.send('Hello Server! im websockt');' C' m1 h) v0 B# N- }, r
  11.     });
    9 H/ F- S( {& X+ Q
  12.     // Listen for messages
    $ u1 D1 j% g# L% o( z# U1 _
  13.     socket.addEventListener('message', function (event) {
    3 r0 N1 z' t% y3 ~. ~5 G$ n+ \; H
  14.         console.log('Message from server ', event.data);
    ! {% o7 `. Z; a
  15.         img.src = event.data;5 }+ B2 |% @2 U  s
  16.     });( `2 U8 j* I! R# A! ~

  17. 2 {* B$ D, w+ ^3 M$ x
  18.     function playVideo() {7 [2 o7 ?  f0 B3 M3 S
  19.         ctx.drawImage(v, 0, 0, 350, 700);" c9 g( I/ Y- \' D( R3 P; U
  20.         dataUrl = c.toDataURL("image/png");" M- l5 T0 ^" y6 Q$ j9 m  z
  21.         // img.src = dataUrl;  g3 t* a- ?- X8 _0 X2 @6 ~  k5 A2 s
  22.         socket.send(dataUrl);6 h9 y& M3 @( f5 l' P* K
  23.     }
    0 Q% R1 F! n8 [) ]" j5 t0 G# f; U5 g
  24.     var tick;0 {; I6 M; Z4 W# J+ N+ e
  25.     function aphla() {8 N# W/ |5 n9 y6 F8 U7 T0 c
  26.         tick = setInterval(function () {+ V5 G, ]( [  N+ Z, E
  27.             playVideo();
    : M+ V) y2 \' Z
  28.         }, 1);
    . {$ ]" `: ^, a7 S9 y; e
  29.     }. T8 E  f1 E. ?
  30.     function vdStop() {
    8 d2 Q, M9 ~2 `
  31.         clearInterval(tick);' f( V2 E/ t  S* r) Z8 t
  32.     }, Q7 v$ t% [) Y
复制代码
用户页面1 h9 w! K& u+ t8 Q! U) B8 B

html

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

javascript

  1. var img = document.getElementById("liveImg");
    5 ~$ ?! i9 `  [5 J
  2.     const socket = new WebSocket("ws://lm.com:9502");1 V  F2 |+ c8 W: M. {
  3.     //4 g! {5 K3 E4 V9 x# {, O8 D6 `# V5 H5 |
  4.     socket.addEventListener('open',function(){  L* O7 s; i3 y# Q) S9 D
  5.      socket.send('Hello Server! Im live.html');
    ( Y7 [2 O7 v+ l2 |5 p" {+ N/ {
  6.     });
    $ y8 C1 t2 C* ^
  7.      // Listen for messages/ E: @+ K( s; y2 p( v, `7 o! x
  8.     socket.addEventListener('message', function (event) {: ~, J8 N" T# f) {: t- R+ r, ^
  9.         //图片地址+ K% Y5 R; A5 [8 m0 }3 a
  10.         img.src = event.data;) S$ A2 e+ u3 S- Q! X6 m7 i
  11.     });. X4 D9 N# \" t
复制代码

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

  e5 _' O2 A& ^

' H: I- m* ?* q$ b/ u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 02:05 , Processed in 0.057611 second(s), 19 queries .

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