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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  4 r  q, r9 ^; v) F/ r
  2. //创建socket服务
    ; M& ^" T+ F: J5 X
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);+ Z5 Z7 w* K% p
  4. //监听WebSocket连接打开事件
    - D5 A1 o0 n+ X/ x0 E; \% m7 C
  5. $ws->on('open', function ($ws, $request) {5 p& J- s* _6 s8 c; A
  6.      var_dump($request->fd, $request->get, $request->server);
    , P8 m' U! l  P. @3 m
  7.      $ws->push($request->fd, "hello, welcome\n");
    - ?  R. x% I% d) j$ K" l2 T
  8. });
    . `) P9 p, V/ m7 z" e+ r; o0 D

  9. ! P" E! v% m, _) _/ I. {1 X  D
  10. //监听WebSocket消息事件! u2 b6 z; o( @. E9 V9 R
  11. $ws->on('message', function ($ws, $frame) {
    6 G4 E2 c. N. Q5 ^4 O7 a& J
  12.     //推送消息给所有用户
    / I( v* ]& D6 T& K  i
  13.     foreach($ws->connections as $fd){
    $ E8 a! j# J' p& g! F8 y& r0 W5 a
  14.         $ws->push($fd, $frame->data);3 r: J6 R, f& l8 Z! U& [
  15.     }
    . A* o; l8 C) v8 u* Z7 t5 m" |
  16. });
    2 _$ X" C& I3 L: p0 E$ f3 y

  17. - }2 I" `2 m9 g, Y# G1 |
  18. //监听WebSocket连接关闭事件
    * ~0 N$ f* G8 M  L4 Q
  19. $ws->on('close', function ($ws, $fd) {) k% @5 A  ?2 D# U: q6 N
  20.     echo "client-{$fd} is closed\n";
    4 ^# z/ `6 s8 V' T1 X+ E  b
  21. });+ z# {% V  A6 u' y. a
  22. //启动服务# |1 O# o/ i* P$ D% q' }2 K
  23. $ws->start();" q) `! ~8 e7 `; N% U) w$ F

  24. ' ]8 y) ?5 N3 w( ?
复制代码

  i) H& ~/ u% P3 s- w- J7 _Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
# g& \+ `; C) @

代码如下

  1. //连接服务器% e4 S! a: U' V: F% {8 o& I& n
  2.     const socket = new WebSocket('ws://lm.com:9502');
      _4 ]& l" g* P) a
  3.     //Connection opened+ d4 _" W+ e; H; T: c
  4.     socket.addEventListener('open', function (event) {: z# z- F4 b' G% y' _' B9 s
  5.             //发送消息给服务器
    9 y- M4 M  X5 l3 f& {3 p7 u
  6.         socket.send('Hello Server! im websockt');
    ( t8 T3 K% _4 s7 X
  7.     });* h0 y1 L' u9 ~1 }2 v9 r6 G
  8.     // Listen for messages; W% w: x; J( N
  9.     socket.addEventListener('message', function (event) {
    1 H1 S3 X- g1 O$ ?
  10.             //接收服务器返回信息
    % v. S$ k/ M6 r* m: S
  11.         console.log('Message from server ', event.data);: o: p1 o7 p  d( d- j
  12.     });( q  ]) B/ C+ H+ k4 h, g4 A+ Q
  13. ) j7 u6 J& _  z. \+ J) J! `" ^
复制代码
伪直播主播页面# L: ?" i! b  I6 o0 {7 I+ f

html

  1. <body>
    : A, B! z3 q. E8 D( U
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    2 q+ F( \5 z, V; ~
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    1 L! |7 l% p% L3 x! {
  4.         画布
    * I) {, Z1 r: P9 t
  5.     </canvas>
    * ~  m4 r  {% \! g' i: b2 i
  6.     <img src="" id="videoImage" width="350" height="700">
    % @1 L2 ?) Z% G& Y. c* N5 z6 b$ I
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    3 V- x: y5 {$ m" ^0 G3 _
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    $ V+ v6 X- F  G$ U
  9. </body>0 m& O+ N3 ]' \7 p: A: Y! F
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    - ~" N1 b( ^+ t+ N! R: k- e
  2.     var c = document.getElementById("myCanvas");- J6 N5 ~3 g4 h8 j7 g- V+ D
  3.     // var c = document.createElement("canvas");) c4 k" {% W! W& W
  4.     var img = document.getElementById("videoImage");3 v6 q  N8 R" z/ j1 j
  5.     ctx = c.getContext('2d');- |" Z9 |9 a( O. z; V, U' R( {
  6.     var dataUrl;" T5 M3 d1 K8 l6 T
  7.     const socket = new WebSocket('ws://xxxx.com:9502');$ a+ a1 u, s; t+ n! L6 O* e2 K
  8.     //Connection opened) \4 {1 ~# ]! A* u
  9.     socket.addEventListener('open', function (event) {
    8 {6 g+ U" x+ \4 e2 b: S+ R
  10.         // socket.send('Hello Server! im websockt');
    5 F+ x8 r" `$ D  R
  11.     });
    " b* Y( o! R2 ^5 Q, `/ l0 j
  12.     // Listen for messages
    ' h2 M( u. E% A" m
  13.     socket.addEventListener('message', function (event) {
    / q3 A" S! J5 }8 R+ N5 ]4 t0 t# Z0 Y
  14.         console.log('Message from server ', event.data);
    ' {' z5 _3 y; e- m- m5 ]
  15.         img.src = event.data;
    - c, {) V. |/ G4 K# t- }, x
  16.     });
    ! ~. N3 Y  f6 z) B0 C

  17. ! P' S6 v, f. e, ~: ~5 i
  18.     function playVideo() {, c% U" O' H6 T
  19.         ctx.drawImage(v, 0, 0, 350, 700);6 W, L: F- w- O% y7 a9 X
  20.         dataUrl = c.toDataURL("image/png");
    . S+ J' n5 B- {' C) n; ?$ F* S/ {* w
  21.         // img.src = dataUrl;
    # W/ L9 b+ y: Z
  22.         socket.send(dataUrl);
      ~; c1 T! r7 p, Q1 Q: s/ M
  23.     }+ G$ A5 U8 c. H& L6 _& u$ }; I
  24.     var tick;7 J/ Y* H! H: u! ~  E. i
  25.     function aphla() {
    * X7 U2 w9 n5 Y' i: o1 |8 A6 }
  26.         tick = setInterval(function () {) n0 }; T; y4 R' M3 q
  27.             playVideo();  q, q' i  S& ^" k
  28.         }, 1);
    " b) y2 z* i! Z  l
  29.     }
    ; g4 w: Q% h8 Z, _% \( l1 \+ ]# C. \
  30.     function vdStop() {; S3 ~% p( l( v) B: ]+ F
  31.         clearInterval(tick);* z2 V+ o  w; C. b1 S% |
  32.     }! B( y  j' b- d, c
复制代码
用户页面( p* K3 e7 Z+ R0 W: j) K* [$ x7 u

html

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

javascript

  1. var img = document.getElementById("liveImg");
    # F3 Z0 S! C2 L  H% s2 z
  2.     const socket = new WebSocket("ws://lm.com:9502");
    , Q/ j  a( O; Z  [4 X
  3.     //7 c, q0 p" X3 L2 @5 v
  4.     socket.addEventListener('open',function(){+ d# Y! K- ~, O* |8 u( W
  5.      socket.send('Hello Server! Im live.html');6 t! ^) |, O1 y8 n, A! X) l
  6.     });8 B* u! U8 y# [
  7.      // Listen for messages4 e) n' j, f2 E; _% l
  8.     socket.addEventListener('message', function (event) {  x9 m, F# x4 E# q6 Q
  9.         //图片地址
    0 T) F# ], a7 m; ]
  10.         img.src = event.data;! D1 y+ ^) ?" e8 K3 A* ?: Y
  11.     });& |9 H, }( U# A) B0 i* z3 \5 A
复制代码

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

( T7 m2 ?% G7 I9 F, f$ t! j

; `& V. m" k. b4 e. c- m* Q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 11:47 , Processed in 0.057302 second(s), 20 queries .

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