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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  : k: U& W% B* u& j' l! k& `- P: [
  2. //创建socket服务: e/ v; c# O. }7 r  k2 a
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);# q- K' S1 G. `; W1 Z
  4. //监听WebSocket连接打开事件
    % J1 u% U5 P* h1 _4 Q* x" @1 K
  5. $ws->on('open', function ($ws, $request) {
    ; k. U. G7 ?/ v, K2 {
  6.      var_dump($request->fd, $request->get, $request->server);
    3 w! {, ^3 @5 Q  }
  7.      $ws->push($request->fd, "hello, welcome\n");
    ; v! {: K9 ~4 U9 _; R9 }
  8. });
    1 w2 r+ f1 D7 h8 J4 R

  9. ) j+ D% L% u  c
  10. //监听WebSocket消息事件
    + x9 v, d$ s+ t
  11. $ws->on('message', function ($ws, $frame) {
    ( R" p& W# n6 D$ D3 d) l* z; j0 R
  12.     //推送消息给所有用户
    3 l1 g6 U" _9 e( @+ R  G
  13.     foreach($ws->connections as $fd){
    $ q1 s: H* X/ J% s6 i8 m
  14.         $ws->push($fd, $frame->data);
    ; m2 o7 U- W: r& j6 G
  15.     }3 d  [$ M4 i4 Q8 N8 N& x2 [
  16. });
    ' `- ^$ Y/ m2 R5 H

  17. 8 {- e5 X/ g9 Q3 X! H/ X
  18. //监听WebSocket连接关闭事件
    . f% R3 @. b" O+ N" R
  19. $ws->on('close', function ($ws, $fd) {
    + n/ S! P& X: v( `4 M+ j0 f8 Z5 r' l
  20.     echo "client-{$fd} is closed\n";" d  O+ ~! T# G+ D4 }! W9 b
  21. });
    * l  a: f7 ~7 S
  22. //启动服务6 }2 }5 c) z% u1 [
  23. $ws->start();
    / |; P+ A  d, A, ^5 J3 x
  24. 1 J1 o0 N( p: \" P
复制代码

" j) k0 \0 ?9 }& h# F; tWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
/ I9 Q2 a1 a2 L, l$ k5 I3 F0 t) w: V

代码如下

  1. //连接服务器1 |6 G% a$ [' G! w* A8 v
  2.     const socket = new WebSocket('ws://lm.com:9502');
    0 f5 Z9 v( f" W9 ]+ R0 P
  3.     //Connection opened2 d. |: j+ I- |4 h/ R) y
  4.     socket.addEventListener('open', function (event) {
    # O" y7 D; }6 E+ w5 i
  5.             //发送消息给服务器
    - o* k& @5 }1 A+ R. g. t) J
  6.         socket.send('Hello Server! im websockt');& f( s: ]  Y; }  i2 T, f( T+ ]2 ~
  7.     });* i6 S" Z; z7 ^$ n- Q: V
  8.     // Listen for messages4 ]5 D# f2 q( g# u8 R- ?- k" ~
  9.     socket.addEventListener('message', function (event) {
      |$ \( I/ y& B6 ^
  10.             //接收服务器返回信息
    : |) [; r) l$ U4 W" |7 ]
  11.         console.log('Message from server ', event.data);
    ' c6 H* ]! z! R- s8 ~' P9 @
  12.     });
    # [, a% h. M5 x+ y+ F

  13. * ^, @9 q' m. T5 H. c' k
复制代码
伪直播主播页面
$ |: E) S7 K$ d6 x

html

  1. <body>0 R& J  t3 h- }, U
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    # p0 T" m& L& M/ |# R* {6 u& V
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">% Q# [" R. z4 D* a. R9 ?6 j
  4.         画布
    - x  T0 n) n" e
  5.     </canvas>
    7 o' r, {8 f2 N0 D7 D4 T
  6.     <img src="" id="videoImage" width="350" height="700">
    & z9 M+ k9 l+ b
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>$ c4 Y+ d$ r% p( Y9 P- k* r
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>, w- F+ M8 E9 u
  9. </body>
    ( }3 T, f+ {/ h# f( p3 X5 ]( d' B
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    ! v( |; @" F5 W/ R# W2 N3 Q
  2.     var c = document.getElementById("myCanvas");
    0 S* [& {: {, [+ t
  3.     // var c = document.createElement("canvas");! h: d+ B! a, `
  4.     var img = document.getElementById("videoImage");1 w$ ?' ?6 z$ l/ h; y
  5.     ctx = c.getContext('2d');
    . t" f  D2 y/ e5 D( G6 @
  6.     var dataUrl;
    + E: N2 S( D, J) o5 G; r$ n6 i
  7.     const socket = new WebSocket('ws://xxxx.com:9502');$ [( [# P: X8 a: Z' O
  8.     //Connection opened
    / S8 |+ ]( s& Q4 s3 D
  9.     socket.addEventListener('open', function (event) {
    0 l% w  H4 o( |. G  T6 Q4 O
  10.         // socket.send('Hello Server! im websockt');8 A; k$ b" V# X6 v1 k9 _9 R
  11.     });
    % t8 `, ?  k5 W' ?
  12.     // Listen for messages
    & m2 `- A) E, z5 g$ W  P' E8 E  h" a
  13.     socket.addEventListener('message', function (event) {
    ( e6 T" b$ }3 j: c, n; U4 c* y- z
  14.         console.log('Message from server ', event.data);2 O* F" c# z4 L; c( S. y5 a
  15.         img.src = event.data;) V, I! e3 ?' H5 \9 d1 d& u" r
  16.     });
    " T* c! _4 N1 V  R2 \

  17. / N3 x3 R; e9 \, y- y
  18.     function playVideo() {
    % c5 u% c6 p/ {! L4 y/ [
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    7 S" k: {+ i3 m$ A/ d
  20.         dataUrl = c.toDataURL("image/png");% U/ O" {7 R8 _) c* z; c. B
  21.         // img.src = dataUrl;. C: M0 Z% e8 H/ y1 u
  22.         socket.send(dataUrl);
    ! [2 c) q; C% d5 k& l
  23.     }3 _3 d3 W1 c/ R- h3 K4 F$ C3 H
  24.     var tick;
    % {! ~3 c# H8 E  k$ v' ^
  25.     function aphla() {
    / f, h" H# F4 c! L9 m' `8 F' l
  26.         tick = setInterval(function () {
    . {. }& ^( N! N
  27.             playVideo();0 Z3 G% w9 p- Q7 d6 b
  28.         }, 1);: |; \5 d% _+ P9 B8 f! O) r
  29.     }" p- w9 n5 G, Y. [* c$ C
  30.     function vdStop() {- a: w; ~! l& s& C
  31.         clearInterval(tick);
    8 h' V& u2 m9 k2 }- _' i; B- L
  32.     }# Y: f# E0 Q9 h" O8 `1 {
复制代码
用户页面
; F2 K0 q  T1 B, m# j+ W3 \: _

html

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

javascript

  1. var img = document.getElementById("liveImg");
      y# i& R2 K0 ~7 \! D
  2.     const socket = new WebSocket("ws://lm.com:9502");# p7 b; M% h. j: Z. ?
  3.     //
    . `7 z" D7 S1 |1 T. W7 d5 i( X
  4.     socket.addEventListener('open',function(){7 G4 i7 Z) u7 A# H
  5.      socket.send('Hello Server! Im live.html');
    $ f. ], N+ M/ b4 H+ f9 z
  6.     });
    : ~+ p* ~4 d( V2 t
  7.      // Listen for messages
    9 S6 _: \- V; N* W
  8.     socket.addEventListener('message', function (event) {
    ! _; H- i0 Q9 M# j: k4 z9 d9 X( H8 V
  9.         //图片地址5 B& X/ B  @! Z8 h
  10.         img.src = event.data;
    4 s- X1 F4 b, x
  11.     });  K2 n7 H! @8 E5 \  D" b1 f
复制代码

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

8 [( C+ P$ L1 \: G  Q2 c5 V5 m

8 q1 u. z# t7 R+ P  e! C' l$ ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-6-15 16:43 , Processed in 0.123815 second(s), 19 queries .

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