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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    , A2 V2 J5 A8 h4 ~* {  O1 E
  2. //创建socket服务
    + M# O8 f8 u. g" h! J' H; @
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    ' t6 o7 b+ z; \  X
  4. //监听WebSocket连接打开事件% q8 p6 M* @# _, A
  5. $ws->on('open', function ($ws, $request) {
    # ^6 c7 N  w, A# X' y
  6.      var_dump($request->fd, $request->get, $request->server);( D! _% l, Q2 N9 E
  7.      $ws->push($request->fd, "hello, welcome\n");- h% f1 Z: V$ t6 P% V
  8. });* y% n) R" q, Y8 t
  9. . |& e$ H& H. q! }
  10. //监听WebSocket消息事件
    + H$ B, w, [% C; {7 {) @
  11. $ws->on('message', function ($ws, $frame) {
    : R1 F' [; \/ z# f* \! J
  12.     //推送消息给所有用户
    2 i# j3 W/ [* Q* O: _8 b7 u
  13.     foreach($ws->connections as $fd){
    ! t) l+ u6 {$ @" o! O8 i  z( R
  14.         $ws->push($fd, $frame->data);( f2 t: W; i6 X2 _* i4 q& a6 v
  15.     }# K; B$ U. z9 V0 ?- \/ \8 r4 V! K
  16. });
    / U/ l/ p8 _* {& ~
  17. ' A3 i( T, o% ^
  18. //监听WebSocket连接关闭事件
    9 B' Y4 F+ w* w7 M* W8 f6 ^6 a
  19. $ws->on('close', function ($ws, $fd) {! Q7 q" \0 b  _) }$ S( M2 v
  20.     echo "client-{$fd} is closed\n";
    7 M, r5 B2 ]8 ^! N# H3 Y  W
  21. });
    - q. y' ~' w5 E% w
  22. //启动服务
    5 n- i" P5 I! X( x9 @
  23. $ws->start();
    ( l# f5 B4 E  v* y! @. V$ X) N5 H

  24. 9 \# ], V2 D8 }6 L6 e
复制代码

' m4 Q; @( i; z7 {! ZWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
2 g9 |3 N5 C5 N- ]( Z" m- P/ w

代码如下

  1. //连接服务器: J- q- ^5 D  K: t) e2 P: x
  2.     const socket = new WebSocket('ws://lm.com:9502');
    9 ^; Z3 L$ \# \# i8 y8 g
  3.     //Connection opened
    : d; Z9 ^8 A6 g) R+ T5 S
  4.     socket.addEventListener('open', function (event) {
    1 O% [  [' W" \+ W; [
  5.             //发送消息给服务器
    9 K# m0 C3 ]( U+ {
  6.         socket.send('Hello Server! im websockt');
    ' T% K! K7 O# g
  7.     });8 _) ]9 v: v4 J* z8 @/ B
  8.     // Listen for messages
    5 i: z( w+ ]; m- L) b+ q
  9.     socket.addEventListener('message', function (event) {, L& V  z2 b6 G3 w* v
  10.             //接收服务器返回信息
    # I5 _; s* F, g$ f3 v
  11.         console.log('Message from server ', event.data);3 `! ]% A# j8 F7 X
  12.     });% ]- `, k% K* \0 [

  13. 9 A) W5 z- X6 E0 p
复制代码
伪直播主播页面
$ u2 c2 q8 s1 ~) H3 S, x

html

  1. <body>
    1 C1 Y2 R! e: j; a
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    # Z; a( F3 f# Y. X  b9 v1 [% X
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">! T! S" L! ]* Z+ J& @) J# J" W
  4.         画布% w4 U; V6 k. L7 r, F
  5.     </canvas>
    " h& v% U1 Y5 E! V- |% [, J
  6.     <img src="" id="videoImage" width="350" height="700">
    4 l( Z1 B# M6 m, @& ^
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    1 ^5 O! f# i# ~6 x7 d% u" A9 @1 l: X) o
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    + P& B( T$ i, v0 J- V, M
  9. </body>
    ) X3 `5 Z+ d! g
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    3 L% F( p. A+ D3 q: x
  2.     var c = document.getElementById("myCanvas");( m3 _: I3 L) v& O* {
  3.     // var c = document.createElement("canvas");
    ( ~2 k9 a8 n) k( J( i/ U& O
  4.     var img = document.getElementById("videoImage");
    0 n: T+ G4 @# W, l1 }
  5.     ctx = c.getContext('2d');/ `) T# E- K/ ?1 |$ ?' T
  6.     var dataUrl;; }" g( e. s: X8 p- H, N9 k
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    " s$ E6 l* o4 k3 G5 e
  8.     //Connection opened
    8 ^4 M) \, }2 W- p
  9.     socket.addEventListener('open', function (event) {
    : o) F5 N1 H" U7 f6 M
  10.         // socket.send('Hello Server! im websockt');  q5 \; v* r' X2 e* J* Z
  11.     });
      I: j  T1 z% Q3 ~- \) g, m2 N7 U
  12.     // Listen for messages0 J- l$ H' g+ F/ {  v
  13.     socket.addEventListener('message', function (event) {
    4 Z6 m6 F1 D! k
  14.         console.log('Message from server ', event.data);
    5 L: ^. f" _) ?$ z) i; M2 a
  15.         img.src = event.data;! g4 `' J( {/ q6 h# E/ x1 e% p: g
  16.     });
    6 x3 d: S0 r8 m( O/ m! z% N$ y

  17. $ ]( n0 L. C: a; i
  18.     function playVideo() {* M: |6 V  G" m' T
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    + M, V. q# Q0 |/ Y  A, G$ G
  20.         dataUrl = c.toDataURL("image/png");2 I" }3 `0 f1 x- B# a5 n! K* H) B
  21.         // img.src = dataUrl;( |+ v% G/ A% [
  22.         socket.send(dataUrl);9 r/ }4 P- Y5 V7 k7 h
  23.     }* y0 p+ b' |4 q) E: ~7 f8 P
  24.     var tick;9 t7 ]" f7 }: m# Z' W/ k# n. N
  25.     function aphla() {2 g" ?: u* b5 [; A$ ~8 M
  26.         tick = setInterval(function () {
    + r. @3 Q4 `3 p/ o  T% F8 Y' T* n
  27.             playVideo();
    9 q% U' _+ C" d- @& {7 I3 J
  28.         }, 1);
    ' o" k, j* _3 S& S- U
  29.     }: i! s7 R# u& {; |
  30.     function vdStop() {% d7 o) |) F/ s5 V4 |: ]2 Z
  31.         clearInterval(tick);
    + c/ @, n. g( }4 S8 b& h' ?
  32.     }
    * B$ a. U' o/ y$ m
复制代码
用户页面$ V9 v5 @6 C3 {* X0 t

html

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

javascript

  1. var img = document.getElementById("liveImg");& B8 U. `: K* M- A
  2.     const socket = new WebSocket("ws://lm.com:9502");
    , |5 b$ ]# ^/ K; s
  3.     //" S( k( d; M8 u0 @9 u' }4 \
  4.     socket.addEventListener('open',function(){
    , j7 s7 h8 J$ _! I% W
  5.      socket.send('Hello Server! Im live.html');
    , d) }# ^! W$ Q0 {# M& f
  6.     });
    % Y% r% u7 k4 F7 |8 |
  7.      // Listen for messages
    5 D% F; u/ S& V% @. w  m
  8.     socket.addEventListener('message', function (event) {2 m: e! t) w! |% N* ?7 }! g
  9.         //图片地址
    5 U: l5 U! P# _7 Q
  10.         img.src = event.data;4 Y9 _7 m- {  w; n! v  j3 f2 E
  11.     });5 Z' ]$ K& k/ L2 @* ^$ r5 z
复制代码

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


( m8 }( c  w" m! K% U& Y
% a/ H9 H. K! P  M% r4 h! C5 }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-16 18:08 , Processed in 0.054916 second(s), 19 queries .

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