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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  + t! j& \9 g, d
  2. //创建socket服务$ c& f- |4 e. A
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    1 }# B5 m4 H6 R9 M6 ~
  4. //监听WebSocket连接打开事件
    4 ?+ F) Y0 B' M. Q. w
  5. $ws->on('open', function ($ws, $request) {, ~% J- k) U' U, S, h$ c& ?
  6.      var_dump($request->fd, $request->get, $request->server);
    + u8 Q2 n" f7 E
  7.      $ws->push($request->fd, "hello, welcome\n");
    5 ^  b9 p' T5 H; B1 A
  8. });
    " ?4 a1 {5 F; _3 L6 B  a' f

  9. / {% C1 n/ I) [. p3 X
  10. //监听WebSocket消息事件
    0 m5 {9 O9 s6 I' C
  11. $ws->on('message', function ($ws, $frame) {0 t& l3 }, F% f( |" q
  12.     //推送消息给所有用户
    # L( \+ _3 V1 F) }" N, ]: t
  13.     foreach($ws->connections as $fd){4 i1 M2 }* W  ]9 g- \* m
  14.         $ws->push($fd, $frame->data);
    - H# g6 X2 ~5 O# h; L
  15.     }" }8 |0 L: ~3 a
  16. });
    # }- [, H# V- n1 c6 D& J6 B8 l5 y

  17. / J3 z" d& W3 J9 `! r
  18. //监听WebSocket连接关闭事件( r% P- G/ t4 B
  19. $ws->on('close', function ($ws, $fd) {
    ! x5 m1 H2 @  b& m, p( Z4 F+ t2 j
  20.     echo "client-{$fd} is closed\n";0 V7 }4 L2 t) |! s
  21. });2 y7 m% f( s% v: o3 }
  22. //启动服务/ v5 R$ i2 ^8 u
  23. $ws->start();2 z, s6 M/ \$ S; X: H& j- d

  24. 5 ^. Y* n; V4 `0 ?  S$ m/ h/ N! U0 E' \
复制代码

2 ]$ [# t2 _  f/ QWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端2 ]2 u9 G. q. i* q5 c

代码如下

  1. //连接服务器5 S5 l0 m8 p1 d: p* N) {
  2.     const socket = new WebSocket('ws://lm.com:9502');
    6 w  \! Y. X1 u+ R" G
  3.     //Connection opened# O/ r3 P  i1 {- y" o* ~
  4.     socket.addEventListener('open', function (event) {3 _) d6 m! K/ z! `" b
  5.             //发送消息给服务器# _  _- W7 l7 `  E, ], T/ C
  6.         socket.send('Hello Server! im websockt');' h* j  n5 h( p  W# j
  7.     });8 F+ r$ B* p$ O% [
  8.     // Listen for messages, \! N& U% W) m3 h) |+ C- o
  9.     socket.addEventListener('message', function (event) {
    * p9 e# X3 V2 ~# j7 K
  10.             //接收服务器返回信息! ]  a9 G4 U8 ?7 i
  11.         console.log('Message from server ', event.data);
    - f# Z5 L# x1 ]+ {. j4 ^
  12.     });
    " F/ o& y1 P7 ~, a
  13. , M" Z# x2 L+ F- y
复制代码
伪直播主播页面8 ^, _: Z# w: R/ b/ ?

html

  1. <body>  l! s5 [  U9 t- F# g
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    : C9 r3 R7 H1 a3 j" Y" a8 \, X# q
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    % K' E" D) \- F5 o( z
  4.         画布3 \+ Y7 X% h( e
  5.     </canvas>
    3 A; e8 m( ^! x: V2 I5 Z
  6.     <img src="" id="videoImage" width="350" height="700">
    * m+ o1 l4 P' w: }
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    7 E1 R; E3 x8 o) B' A4 e
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>3 o9 t1 G9 k2 }$ K& J, c3 E: n
  9. </body>
      _( l3 t# S" m! K
复制代码

javascript

  1.     var v = document.getElementById("myVideo");6 j8 z0 }3 h: D; g; D6 ?6 O2 G
  2.     var c = document.getElementById("myCanvas");  w! s3 r7 w* A1 k8 G7 O
  3.     // var c = document.createElement("canvas");* T1 F+ u4 q- T) o! [; Y' i
  4.     var img = document.getElementById("videoImage");7 ^, |) ]4 @' l! R
  5.     ctx = c.getContext('2d');
    3 K4 }1 V- T" z7 ?  \
  6.     var dataUrl;
    7 M! p( C4 m; J) v: O  _+ P
  7.     const socket = new WebSocket('ws://xxxx.com:9502');! A. B& i$ |& O% u* X5 W4 i
  8.     //Connection opened
    6 ?, h7 `3 v0 o- @: x- @0 N
  9.     socket.addEventListener('open', function (event) {
    4 [7 i% L$ L7 U: a5 m: y4 Y
  10.         // socket.send('Hello Server! im websockt');- A, B7 o' F& z! G& J6 A7 M
  11.     });
    1 Q& Z) }. R+ H
  12.     // Listen for messages, {2 k2 O& i4 N" b
  13.     socket.addEventListener('message', function (event) {' c- ]& r7 G2 T! H5 o
  14.         console.log('Message from server ', event.data);  P/ l; E8 [; n7 i4 `9 K4 P+ A* g$ V/ F
  15.         img.src = event.data;
    % Z" H7 w' Z* _: M6 F( A% u
  16.     });
    # c; `4 B: }0 D! r1 X, H9 M# [' I" g

  17. ! {% q3 K9 G: j4 E4 Q2 u
  18.     function playVideo() {' S1 G  b8 Z: I9 y* D3 h
  19.         ctx.drawImage(v, 0, 0, 350, 700);! ^4 |) q' k2 c) G
  20.         dataUrl = c.toDataURL("image/png");; L1 ~3 _: ?( e/ K
  21.         // img.src = dataUrl;' K; e# j9 p$ d% z; J6 b- c
  22.         socket.send(dataUrl);+ a6 i: W& n7 W/ D
  23.     }
    4 _$ s8 a' r1 _% B4 O
  24.     var tick;: h/ {" K0 u: M8 N9 t( L7 F
  25.     function aphla() {
    , d* r% n7 h1 R0 G" D; h8 V
  26.         tick = setInterval(function () {; h: z" r5 p) o  _$ e
  27.             playVideo();3 K6 b8 P, A9 I
  28.         }, 1);
    3 `# x, ^5 {$ g# P, \6 v
  29.     }
    ) J; L0 ^+ ?) F1 {
  30.     function vdStop() {7 \, ^# p5 [0 a+ ]
  31.         clearInterval(tick);
    3 s( }/ T/ ]3 t0 h; u7 [' A; q0 f, G
  32.     }% Q4 I# L$ G$ r" F+ C3 m5 F, C( X: r
复制代码
用户页面
& r3 V, u: G  H% t+ _+ |

html

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

javascript

  1. var img = document.getElementById("liveImg");2 B( `; z* B: m0 ~" M
  2.     const socket = new WebSocket("ws://lm.com:9502");; v; M8 w# A1 K9 d& p7 h( w
  3.     //
    5 F+ T$ D1 t! l- s; w6 ?0 F
  4.     socket.addEventListener('open',function(){" m2 D, n) x7 R$ S* [
  5.      socket.send('Hello Server! Im live.html');4 E* }/ x5 {2 a) n, f& u' \
  6.     });' y; o3 W, w: p; x" k% J
  7.      // Listen for messages
    / I9 E, a" |6 r  i# C  e  N
  8.     socket.addEventListener('message', function (event) {
    - s& F' _, X6 d3 T+ L3 K
  9.         //图片地址& T1 @$ @) N6 _' h
  10.         img.src = event.data;& F2 r0 L9 P' s- k6 E
  11.     });
    1 A; {7 ~* b" ?9 {9 }( u0 _
复制代码

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


# H5 A5 u: P' M' i" R) @
5 E% U1 q6 l& R( H( a4 q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 06:18 , Processed in 0.141597 second(s), 19 queries .

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