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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    1 b4 C: r' j+ g. C- T9 U8 r
  2. //创建socket服务
    6 e% b: U1 ?3 \: W4 z4 F3 O
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    3 f$ N6 S6 e6 }0 h8 r' o- o3 ^
  4. //监听WebSocket连接打开事件
    5 u' y: @- L% V8 `( f$ S2 E5 G* `
  5. $ws->on('open', function ($ws, $request) {
    / s; D* I2 y( G9 T1 A( V& E5 P
  6.      var_dump($request->fd, $request->get, $request->server);
    1 o1 n+ z6 u- F1 E" b2 p% R0 K
  7.      $ws->push($request->fd, "hello, welcome\n");
    $ d! ]1 n* n1 P0 I
  8. });0 k/ D# G" J7 |/ I! Y3 Q
  9.   s# Z5 I" `* N7 x2 ~7 H2 D4 E- A
  10. //监听WebSocket消息事件
    , n9 v5 g9 l$ N! k$ o( H0 w
  11. $ws->on('message', function ($ws, $frame) {' f. E9 Z5 s# o
  12.     //推送消息给所有用户
    . w7 W& j' {; {# E# M2 A! ~! ]+ s5 j
  13.     foreach($ws->connections as $fd){
    & K2 q# t* w% `* T2 o) M2 |' y/ `& l
  14.         $ws->push($fd, $frame->data);1 W7 c6 M0 Q' z( f1 S4 R$ e
  15.     }
    - d/ c3 W( w" l  a+ T
  16. });
    0 P2 l) ~, J" N8 O
  17. 5 f& r/ N! V) w: H) l) |
  18. //监听WebSocket连接关闭事件
    & c, G) Q6 B8 A% X2 D& p
  19. $ws->on('close', function ($ws, $fd) {
    ! O0 L' Y' l- l0 H! y8 N
  20.     echo "client-{$fd} is closed\n";
    6 G; T$ V! O' h$ P; ^- ]
  21. });% D7 m6 V( G) p. M1 S1 b2 u  G
  22. //启动服务; O! F: j+ o5 ?$ m2 l+ C" P, J
  23. $ws->start();: W5 N& G7 i0 V& u* K* Q% @. o

  24. 0 U( i5 ~- g  ?8 a2 _9 W, I
复制代码
; r8 `( p) X3 K3 J, j6 z% o
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端6 j$ I" J# \  K

代码如下

  1. //连接服务器
    7 _( b9 @" P! r) S8 D
  2.     const socket = new WebSocket('ws://lm.com:9502');1 P: [& F* y. h- m8 \
  3.     //Connection opened" y4 I4 Z2 t$ f- a- R5 H' L9 Q
  4.     socket.addEventListener('open', function (event) {( S. k( m! H' {+ O3 r$ Z. f  g/ a5 W
  5.             //发送消息给服务器
    3 Z6 O9 |2 d  h9 p6 U- X9 N
  6.         socket.send('Hello Server! im websockt');
    . B  }9 ~5 c0 h5 `8 ~6 h
  7.     });) e1 q. Q1 `* ~+ ~, v: W
  8.     // Listen for messages
    ( O8 _; P& D  y
  9.     socket.addEventListener('message', function (event) {$ I$ J% I3 ~2 _. e+ |; u
  10.             //接收服务器返回信息
    5 L1 t; U, K& L
  11.         console.log('Message from server ', event.data);. X: H6 z7 C5 c5 C
  12.     });# N- j. k+ q1 r8 s! Z
  13. . \  i4 h& F" L/ \9 h& k; ]2 u
复制代码
伪直播主播页面
: X2 n; x  {: Q2 e) L. F) K/ K* J9 c- D

html

  1. <body>2 ~% `) `& U, O" @7 u$ X
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    4 d5 `0 M; M3 }4 r) i8 M$ J
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">9 M# n8 k# c/ }" G: w9 K
  4.         画布' w+ v9 T$ n; y1 O0 @: [
  5.     </canvas>
    ( m& E5 W1 m# M- o* U# ]) j
  6.     <img src="" id="videoImage" width="350" height="700">
    9 {) d4 L+ b0 Z3 H  p
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>) m4 d" k5 x4 P% ?; [
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    6 R7 s' Q4 A4 z6 G+ W/ J
  9. </body>
    - d: _. l9 o/ t7 Q! Q
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    ' _. ], E. A! o% u% M7 u: }5 q6 J
  2.     var c = document.getElementById("myCanvas");6 f( t5 h- f) X* B6 [# c- h
  3.     // var c = document.createElement("canvas");
    ) P* H/ _7 s7 w, D
  4.     var img = document.getElementById("videoImage");- x$ Q# I  ~7 Q  j* G% F! [7 r6 A
  5.     ctx = c.getContext('2d');
      ~+ I& O& `/ D0 X3 O) d; M, D
  6.     var dataUrl;
    2 C; `" s2 r4 `5 Z( v/ J- g
  7.     const socket = new WebSocket('ws://xxxx.com:9502');/ L- Y- D- q4 i
  8.     //Connection opened8 \- V5 D+ v4 J+ l- M
  9.     socket.addEventListener('open', function (event) {
    8 N# }, j5 |$ F6 g7 }
  10.         // socket.send('Hello Server! im websockt');# S+ s. z1 x: _, ^/ z
  11.     });
    ! s4 C( D3 a6 y& {, B, Q9 t( v
  12.     // Listen for messages
    ; J4 p& c5 ^+ b
  13.     socket.addEventListener('message', function (event) {; p- i% H2 [( f$ i
  14.         console.log('Message from server ', event.data);) i6 y+ O: W4 ^
  15.         img.src = event.data;! Q7 N+ _" T" j7 Z1 t
  16.     });
    9 ]  L) H* ^9 S* V9 q$ M8 Z

  17. 9 [0 |; r3 R5 a
  18.     function playVideo() {
    " q9 `. d9 W9 w- b3 m5 c" |
  19.         ctx.drawImage(v, 0, 0, 350, 700);6 |% @. {. |4 K' l5 t
  20.         dataUrl = c.toDataURL("image/png");) @& o# S* q& D& x( f, Y8 k! c
  21.         // img.src = dataUrl;
    ) M+ D3 ?: x( M% h& }  [
  22.         socket.send(dataUrl);5 S! m& J. e7 E% z
  23.     }
    ) `% q% Y1 m) n* h$ ]
  24.     var tick;
    8 }5 o/ Q8 |1 Q* w" Q, F7 c
  25.     function aphla() {/ a( O. Y& N* Q/ {& X, g
  26.         tick = setInterval(function () {; x1 ~$ a  r5 i" b& V/ ^
  27.             playVideo();
    % V  Q. ?9 V) U: |
  28.         }, 1);# l3 v. x9 w6 Z7 b4 p0 n9 g
  29.     }
    " g0 j) T0 |( y- J0 I
  30.     function vdStop() {3 e  e" o; U) y
  31.         clearInterval(tick);2 b; \( B/ V$ A8 y- e( X
  32.     }; j3 e; ^5 Y5 @& p  L# `7 J
复制代码
用户页面$ m3 [" a5 v7 q7 Q0 ^3 A

html

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

javascript

  1. var img = document.getElementById("liveImg");6 G" O$ e" `9 }9 N  {) N
  2.     const socket = new WebSocket("ws://lm.com:9502");/ @8 M" j5 f  e7 J. t4 L
  3.     //
    . J+ @  e7 R; U5 i+ ~, A
  4.     socket.addEventListener('open',function(){
    * P# w5 o# e" R, F
  5.      socket.send('Hello Server! Im live.html');
    8 q7 Y0 v% D9 k, x7 A! G
  6.     });
    + i' {+ h# G; ^1 c# W
  7.      // Listen for messages
    / Z- V6 L+ h) y, q  x6 ]
  8.     socket.addEventListener('message', function (event) {5 n5 W) q! ^, e* S6 G$ F" N3 m
  9.         //图片地址6 g; b! }0 |; s; o' g9 N
  10.         img.src = event.data;
    ; o! F+ Z5 e) S# f) G% C
  11.     });# z% V- y% g& A3 {( A' V! B/ m
复制代码

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


. ~! ~4 b4 S7 G. F1 ^& k
0 z0 L0 B+ g; e4 I! ?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:31 , Processed in 0.082727 second(s), 20 queries .

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