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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  ) a7 N' _: _8 j3 ?  Z7 f
  2. //创建socket服务4 ~; F6 s+ J, F6 \" q& D
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);1 _; s/ U, C- i
  4. //监听WebSocket连接打开事件+ Z9 u* T& Q* g9 l, P8 e
  5. $ws->on('open', function ($ws, $request) {* t/ e" ?6 P; V4 _' O( F( J0 R
  6.      var_dump($request->fd, $request->get, $request->server);
    . M. o. ^/ O+ Z% A/ g" H
  7.      $ws->push($request->fd, "hello, welcome\n");3 l' J- q( \: [5 e
  8. });6 I( M/ C8 V+ U4 l0 V' e: f2 a
  9. # ~) j6 k) @3 V- j2 W5 H
  10. //监听WebSocket消息事件
      ]1 l; p- z. t4 N: u2 g- `
  11. $ws->on('message', function ($ws, $frame) {
    9 a: _* R5 O) ^6 ]! w7 R( ^$ V
  12.     //推送消息给所有用户8 g& f# N8 F- |! F% u
  13.     foreach($ws->connections as $fd){
    6 x6 c3 v! q6 N
  14.         $ws->push($fd, $frame->data);
    # r: J5 g- g: R7 Z3 y, d+ ~
  15.     }1 H8 u& x1 ?# U0 L% N
  16. });& }$ y* H4 L+ `, u2 Y
  17. % v1 ]1 _" g- K
  18. //监听WebSocket连接关闭事件
    : q! R1 y6 A" j% G9 M) s
  19. $ws->on('close', function ($ws, $fd) {
    ) f$ o5 }9 D3 E" j1 o* _
  20.     echo "client-{$fd} is closed\n";
    7 S8 e- @3 }7 e; r, p
  21. });7 @2 u- G  C! w% r# M6 B
  22. //启动服务+ X3 G5 R4 \1 s9 M9 A1 C
  23. $ws->start();" e9 W1 {2 a/ T0 C

  24. , X# V3 E8 @4 @( e
复制代码
% X; n1 E9 O1 g
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
6 e& ~3 c+ T2 g: m( t

代码如下

  1. //连接服务器, t) E3 ]3 ~/ R) p! e9 ~! W
  2.     const socket = new WebSocket('ws://lm.com:9502');, o, i4 Q  i  a( m
  3.     //Connection opened) S! S+ g* N# K3 m. v
  4.     socket.addEventListener('open', function (event) {, V4 D8 L; p8 f- N+ a5 S( E5 K
  5.             //发送消息给服务器
    9 X3 [, V& C& Y# f
  6.         socket.send('Hello Server! im websockt');" w+ Y, H( i5 w5 r3 M
  7.     });
    " N1 a8 W. [( p' |) F
  8.     // Listen for messages/ R8 S, x' _7 j! ^. [  U
  9.     socket.addEventListener('message', function (event) {
    3 Q! h4 j- v6 I# ^/ W, J4 T7 _
  10.             //接收服务器返回信息) o& A4 Y1 P% a& S4 P
  11.         console.log('Message from server ', event.data);1 }$ ]4 c2 C. V& `) T* w, i
  12.     });
    5 v, n5 O5 }; h" f7 C

  13. * e5 g5 X0 j7 _
复制代码
伪直播主播页面
: W# A8 |7 \$ Q  `

html

  1. <body>
    . Y0 ]/ @) V* \) v, C
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    * t  }* M) w; [  k3 y8 e
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">: z! {1 |! j4 x" x5 @
  4.         画布$ l$ \6 U3 _5 @# C  J0 h
  5.     </canvas>
    5 C5 [6 Q: ~. ^4 H- i% h( S
  6.     <img src="" id="videoImage" width="350" height="700">
    ; n. m8 |# z; {# O
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>' c  Y+ p# c" A2 T3 V1 t  P
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>0 L$ x+ O7 R# Z" P% p$ s# T9 n
  9. </body>
      p! U4 E9 Q, E% O# Y$ C. o- M
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    4 p+ e: ^( a+ l  `
  2.     var c = document.getElementById("myCanvas");$ Y- ~; t1 [  L7 G. i
  3.     // var c = document.createElement("canvas");
    2 U6 A- w9 @# M+ G
  4.     var img = document.getElementById("videoImage");
    ( S8 M5 u( n, q( E
  5.     ctx = c.getContext('2d');0 S6 k$ T: X3 S7 u
  6.     var dataUrl;+ S1 B  C+ o, {- D( J* R6 K' y
  7.     const socket = new WebSocket('ws://xxxx.com:9502');. A7 n8 M  M9 _( e1 i9 ~2 V5 p
  8.     //Connection opened
    . n9 A, M  E- I
  9.     socket.addEventListener('open', function (event) {
    " d3 q, }& ^) O6 B( e) l
  10.         // socket.send('Hello Server! im websockt');+ D% v; w- M5 S1 L: Z4 X
  11.     });2 n3 T4 e: @# z* T( }) [
  12.     // Listen for messages
    $ G5 Z3 ?9 q! P2 ?
  13.     socket.addEventListener('message', function (event) {
    3 ~4 y! b  B2 h1 z  f
  14.         console.log('Message from server ', event.data);
    7 Z3 y# {* O, Q# }6 T* F
  15.         img.src = event.data;
    . j% R0 L  R; O* V' A. c# V3 p
  16.     });
    ( ?* Z9 ]4 [7 {* p3 h! z. u- ^8 V
  17. / y$ k& ^5 K; V/ p  v& Q( n
  18.     function playVideo() {
    , R8 F$ {/ }6 c
  19.         ctx.drawImage(v, 0, 0, 350, 700);) g8 U' q6 O6 u
  20.         dataUrl = c.toDataURL("image/png");
    ; w3 ]6 s) {2 u$ U9 N. I- s: H4 U4 n
  21.         // img.src = dataUrl;
    4 r( l' R5 {/ j$ O3 N
  22.         socket.send(dataUrl);
    & \8 d: S- i# F2 O' p! v
  23.     }, N. T/ P. n; D
  24.     var tick;
    9 P! W$ w; S8 @2 j" w  ^$ e
  25.     function aphla() {
    5 q& {3 ?' T2 ?4 G; E  M9 \, i
  26.         tick = setInterval(function () {
    ' I4 c, B5 k; ?+ p5 B9 e
  27.             playVideo();
    / ?: `+ _) E9 j1 x7 i
  28.         }, 1);
    % p' E4 @1 {8 t1 \. [) ]
  29.     }  M  N$ p& R  R
  30.     function vdStop() {
    9 g) q: V- i/ P8 @& A2 k+ e
  31.         clearInterval(tick);. O/ T2 Z8 o$ I/ Z* Z1 y! y5 c
  32.     }2 F) w" U  \+ u+ n3 y
复制代码
用户页面( h% C; E2 o0 U: {5 V& P

html

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

javascript

  1. var img = document.getElementById("liveImg");6 L8 w4 I4 U7 V6 h
  2.     const socket = new WebSocket("ws://lm.com:9502");$ j" a7 Z  X: w. O
  3.     //
    - n" j' Z) d! h& Z2 M/ K& L- |# l6 [
  4.     socket.addEventListener('open',function(){
    $ o0 W7 q7 a$ q  c; W
  5.      socket.send('Hello Server! Im live.html');
    7 W& O' _7 \' L
  6.     });: m) `0 W: r" y0 q7 ^
  7.      // Listen for messages; T! O+ Y( b/ Y/ b0 l
  8.     socket.addEventListener('message', function (event) {" ]. }( D1 Q, n8 H6 A( v) B
  9.         //图片地址$ ]  {* V/ i  t! p6 d
  10.         img.src = event.data;
    9 o& {- _" n5 c$ \
  11.     });, U) }0 Y  r$ e4 P2 V4 f0 t
复制代码

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

0 x% ]9 D' F$ A# `

) \9 W9 M" R0 p- [
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-21 00:16 , Processed in 0.074150 second(s), 20 queries .

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