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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  $ ~5 w; K8 i1 u) \0 }" a
  2. //创建socket服务6 u, ]$ ^/ n9 Q0 d- N- F8 k
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    : X/ q) k& i7 _7 z) T$ c
  4. //监听WebSocket连接打开事件
    0 j3 Y/ [( B% `. G. b- E
  5. $ws->on('open', function ($ws, $request) {0 |& }5 ]' F0 k$ B! y) R
  6.      var_dump($request->fd, $request->get, $request->server);
    " s0 ]3 `0 {6 p' _9 |+ b$ P
  7.      $ws->push($request->fd, "hello, welcome\n");8 W0 C$ U9 w  I
  8. });
    3 h  [) W7 K% S7 e* s  `4 Q
  9. ) ?0 N+ o+ S9 V  x: R
  10. //监听WebSocket消息事件, W0 z1 M# p. a3 \- P+ |8 c
  11. $ws->on('message', function ($ws, $frame) {; g% G& S6 B4 g; U  B  k
  12.     //推送消息给所有用户  e0 K4 z0 a! U: n4 o, K1 o
  13.     foreach($ws->connections as $fd){' N8 x6 p/ y" {  {+ }# \
  14.         $ws->push($fd, $frame->data);
    # I  i5 e2 {( z- G
  15.     }
    ; ]3 H( Q# b" M1 y6 r2 H
  16. });& Y  g" s: R4 |: D  Q

  17. ( l0 J( t3 H9 z2 P( N
  18. //监听WebSocket连接关闭事件
    * A5 r* ]- a- ?$ u
  19. $ws->on('close', function ($ws, $fd) {# U# {, a5 T9 y. M, F. ^
  20.     echo "client-{$fd} is closed\n";
    1 \$ D6 f: p# e8 q
  21. });
    & g# q- l' n) Z# n: ^
  22. //启动服务: j0 d% ~& C- J9 u4 {, C$ ?3 M% \
  23. $ws->start();9 a+ u( z6 U$ U$ L

  24. " w) w( Q, k$ d, ]+ t; Q
复制代码
7 b* m: e8 I# u# b0 L: m
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
0 Q. I- F1 }- {' w, @

代码如下

  1. //连接服务器
      n1 E& i$ e: S$ C# V" I
  2.     const socket = new WebSocket('ws://lm.com:9502');
    5 R' q- f# [6 {, O$ z3 B: o3 [3 }
  3.     //Connection opened9 `3 |: L1 i: J: M9 ~# w7 N
  4.     socket.addEventListener('open', function (event) {3 H! ]! c$ _2 U4 G$ ?2 R
  5.             //发送消息给服务器
    & m/ I. C" L9 S0 h( A$ y
  6.         socket.send('Hello Server! im websockt');
    4 N$ {9 _& U0 B( O
  7.     });
    7 X" r- {6 ~6 s& Y% t+ F4 m  l# J
  8.     // Listen for messages
    + @9 f- |1 C* y# v/ h, g" {2 ?; d
  9.     socket.addEventListener('message', function (event) {4 j' x1 S! d- W1 r9 Q7 j: ~
  10.             //接收服务器返回信息5 F' G6 r% e2 E8 H4 \
  11.         console.log('Message from server ', event.data);
    ! {' X$ U3 D6 ]3 Y8 ~: A
  12.     });
    - K- t. q( K1 b) X) R) l: m8 ?
  13. . s2 `, H+ P; |
复制代码
伪直播主播页面: P0 `8 o, s( D& g5 b' `+ B

html

  1. <body>( F. G/ g. s  i+ O" o: Y
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    7 C" s1 ~3 u) d' [! u7 s
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">6 X6 \: K* n1 _! g
  4.         画布& M0 [0 o0 ~6 U4 |  b) O+ `
  5.     </canvas>7 ~' I; B  R5 O
  6.     <img src="" id="videoImage" width="350" height="700">
    8 R$ x" c5 Q$ ]; z
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    ( s% @  O! r1 n0 |6 D  e5 ?: e0 t
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>/ S: v" H5 W! y% q
  9. </body>
    - x+ r' p* z- U% m: T' F# G/ J
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    & E$ q% M0 Y* d7 c5 k
  2.     var c = document.getElementById("myCanvas");
    : w& K2 J3 h. s2 g* w  c, T
  3.     // var c = document.createElement("canvas");1 q& h: J% p- x
  4.     var img = document.getElementById("videoImage");* A- |/ r1 A9 }5 {4 W3 h
  5.     ctx = c.getContext('2d');
    ) _/ U- {4 D) F
  6.     var dataUrl;
    ) V: |% S# P4 Z/ I
  7.     const socket = new WebSocket('ws://xxxx.com:9502');; A" O) {7 _7 Y, n* L1 p
  8.     //Connection opened" k  d1 r5 W9 D, b' N. y# e' g
  9.     socket.addEventListener('open', function (event) {% L( o% _! K& P4 E# E
  10.         // socket.send('Hello Server! im websockt');
    ' Y5 ~5 M! J9 k3 g' C
  11.     });
    3 x2 y: J+ ~$ F! b0 _& G6 l
  12.     // Listen for messages
    4 b( U* b' C: o, ?
  13.     socket.addEventListener('message', function (event) {
    . K; |; Z* o* A) ?$ q
  14.         console.log('Message from server ', event.data);
    + P1 i5 ~1 ^0 H9 v
  15.         img.src = event.data;
    / _$ Y1 u9 Z2 v! E7 m% L" ~
  16.     });
    ' c) j% Z( f# }* Q

  17. 5 {3 _3 e' u2 S# Y, [. v8 A
  18.     function playVideo() {
    0 U3 M* z6 A3 S) J$ `9 @. D: ]
  19.         ctx.drawImage(v, 0, 0, 350, 700);/ a. Z. v2 f  \3 _" s* g8 H
  20.         dataUrl = c.toDataURL("image/png");
    3 w* |  f2 A2 q/ B( q, P
  21.         // img.src = dataUrl;
    " L. c$ o/ v, }8 n  R
  22.         socket.send(dataUrl);  S4 m) \7 ]6 `# J# G' _: y
  23.     }( g% q- w4 e' t; A
  24.     var tick;& N1 a1 D- y4 L! n; I
  25.     function aphla() {: F( _# d1 _" O
  26.         tick = setInterval(function () {2 S. c: }$ b: k8 i( r6 H
  27.             playVideo();
    # F' E5 [5 K: g
  28.         }, 1);- B5 y* A# b$ O! ]9 A
  29.     }
      ?' {# z/ I/ r- X, A- y7 h( L
  30.     function vdStop() {! O* K+ P; g5 g4 @
  31.         clearInterval(tick);5 {  g, j6 O0 M, g; K
  32.     }
    . j7 S( c! J' {9 h% }% C$ Z* F
复制代码
用户页面, D/ s- m' M1 K

html

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

javascript

  1. var img = document.getElementById("liveImg");
    $ `* O) d, x4 \4 ?1 K1 {  {( f
  2.     const socket = new WebSocket("ws://lm.com:9502");$ h6 r! k- a0 J6 @4 |4 H/ s
  3.     //8 n+ v4 v: g# ?
  4.     socket.addEventListener('open',function(){
    , g- o! [& `6 A6 i
  5.      socket.send('Hello Server! Im live.html');3 J! `6 o% g' r  c4 ~
  6.     });
    0 }( b" Y: B& I6 w! }- e
  7.      // Listen for messages
    3 j; |7 @; Y" x' Z6 _: M; B
  8.     socket.addEventListener('message', function (event) {% W% g9 D& R6 Y# I8 R% {
  9.         //图片地址* I% w8 n3 a2 q1 S; d
  10.         img.src = event.data;* m$ E. U9 {3 O6 ~! b- B' i1 ~
  11.     });2 b8 w+ f2 I; I: g
复制代码

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

; f& B& @- G5 }/ U% x8 s# F

0 I( k5 g" d& A5 C  u  b- Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 19:55 , Processed in 0.065031 second(s), 22 queries .

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