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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    $ U0 E0 ?9 i% Q5 e9 W5 _4 l$ s5 r. o
  2. //创建socket服务
    # r, [- _: ?5 Z! E* [# V7 ^9 L/ \5 n
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    4 n" R( L) i1 m* I
  4. //监听WebSocket连接打开事件: \4 w3 K% c: i; ^' U. E+ b( U, T" {
  5. $ws->on('open', function ($ws, $request) {
    & W; K8 B# i( {" N6 _5 M" A
  6.      var_dump($request->fd, $request->get, $request->server);+ i0 o' d; U* Q
  7.      $ws->push($request->fd, "hello, welcome\n");0 }, u- d+ Q' m7 z6 T- X$ z; R
  8. });
    7 `7 h: J8 h4 {

  9. - i7 i2 Q6 v, S% V
  10. //监听WebSocket消息事件3 O( x. f1 y# r3 ]
  11. $ws->on('message', function ($ws, $frame) {! |$ F, ?4 ?  d; R. |
  12.     //推送消息给所有用户0 d9 a  c5 l, h! ~) ]2 j5 O
  13.     foreach($ws->connections as $fd){
    " k6 T" N1 p  X$ S, A
  14.         $ws->push($fd, $frame->data);
    $ t& r6 ]- R0 X" B
  15.     }8 ~5 n) H5 N6 f: J
  16. });$ B) p5 T. j3 R7 @' T

  17. 6 x0 G& }, I) M6 I9 G$ h
  18. //监听WebSocket连接关闭事件5 R7 b/ {2 J# t" |, T( y; r8 R. E
  19. $ws->on('close', function ($ws, $fd) {
    4 H. n- o( Z7 g2 j
  20.     echo "client-{$fd} is closed\n";) B( Y" c: V; ~+ }0 v
  21. });$ G  N$ t0 Y, N
  22. //启动服务
    1 c1 W" }1 \0 a6 i2 Q, D
  23. $ws->start();1 |0 g# [4 L0 y6 c
  24. ; _  W% M! F9 A# B- x* m
复制代码
3 l: V  a+ X& R& j; |1 c6 R3 J+ p! N9 H
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端# j  k7 B. F4 q1 q! M4 H8 H

代码如下

  1. //连接服务器
    & a7 b0 p5 S( J+ v- B+ y
  2.     const socket = new WebSocket('ws://lm.com:9502');
    1 I0 g; {( q9 q& O3 A  K
  3.     //Connection opened
    " s. i9 @& r* c" N0 t" `; L! y
  4.     socket.addEventListener('open', function (event) {  ?2 U# Q8 H- L( i
  5.             //发送消息给服务器2 n9 H( g3 m. H8 u/ T8 ~
  6.         socket.send('Hello Server! im websockt');
    : P( L" u. w# x6 N( D) J# S( |. j7 [
  7.     });
    ( h" m2 g0 w+ `" m( v# n- ~
  8.     // Listen for messages
    4 V- t/ V7 Z- a" l
  9.     socket.addEventListener('message', function (event) {
    0 b8 O5 A- s4 E/ W. w/ U
  10.             //接收服务器返回信息) l" x$ H+ B4 l5 `7 K/ T
  11.         console.log('Message from server ', event.data);% V! j" @  v, H' a( ^& B. @; @& ^
  12.     });3 v/ b& t, `2 D% Y6 ?) O
  13. 1 x0 Q6 P; s2 b( V' L: s1 N, ]6 L
复制代码
伪直播主播页面
1 J  f" f+ V( c) y9 h  K

html

  1. <body>
    " l# {6 f6 `& W
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>2 F% B/ A! T: v6 v% v6 A2 l
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    * M1 `/ {. H! J* P% J+ ]3 r* U
  4.         画布3 W; H9 j4 b3 J2 [0 N7 U/ U7 U
  5.     </canvas>
    3 n* G6 r& s( H0 c( E
  6.     <img src="" id="videoImage" width="350" height="700">/ `! z0 M7 {9 Y% |
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    0 [  ?- l1 t+ h
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button># }% g( g3 u( `5 n7 s: K
  9. </body>
    2 Q; ~% t4 s/ P5 G3 e# H$ A% w. H
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    % b7 ]+ q' g: {( v# p
  2.     var c = document.getElementById("myCanvas");9 C; p( p$ @5 Z
  3.     // var c = document.createElement("canvas");6 X( U' m- P& [9 L# Z( b; y
  4.     var img = document.getElementById("videoImage");
    & u! m" C, r/ F; |! u0 `: v
  5.     ctx = c.getContext('2d');
    5 g" j2 d5 e6 ?# Q1 U
  6.     var dataUrl;7 V9 P! `  X$ ~% G$ H# {1 k
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    + K/ B; c0 @7 N; g4 {8 R$ n
  8.     //Connection opened
    + R. s6 H, X: l, N; [
  9.     socket.addEventListener('open', function (event) {" w4 j8 O) C  \7 W2 d7 K* u
  10.         // socket.send('Hello Server! im websockt');2 ]/ |' E7 h' l9 |* j: Q
  11.     });. Z4 O8 m# x" O
  12.     // Listen for messages, |3 P5 b" r% L! d8 o8 E, }2 f
  13.     socket.addEventListener('message', function (event) {9 B) @- a/ U0 z, P' N2 n
  14.         console.log('Message from server ', event.data);+ F0 N7 ~# N  y' M! [
  15.         img.src = event.data;
    ! Z" f8 B' U, h; N5 V( u- o! k& w% O
  16.     });  {  o8 I* o* e2 ~) }7 F* B

  17. 9 [: q5 k9 ^; T# R: V3 t; o" p
  18.     function playVideo() {
    0 G$ ^! f4 g* L( l; n
  19.         ctx.drawImage(v, 0, 0, 350, 700);; W4 \8 o% o! s/ [; H
  20.         dataUrl = c.toDataURL("image/png");+ P) T3 ]  w7 Q$ h$ E
  21.         // img.src = dataUrl;* r/ Z" x) o( b$ x
  22.         socket.send(dataUrl);
    % v7 x  @6 m4 L7 c6 f  K+ c5 j
  23.     }
    6 H/ _3 ]" |" G/ Q; L
  24.     var tick;. V  R* d1 u1 x/ r: Y1 Y4 e
  25.     function aphla() {: c. ~( F) m+ o! x- c
  26.         tick = setInterval(function () {
    $ e0 g, I- m9 @- F  ~
  27.             playVideo();
    8 y1 {7 k: z* A2 a0 H( C$ ?
  28.         }, 1);7 C' |& w0 z$ g
  29.     }7 l: I. r, u* y, l
  30.     function vdStop() {9 s, a) |: z$ }3 V0 N7 F
  31.         clearInterval(tick);
    3 s- Q8 p+ Y8 P* s- w- K) }$ y
  32.     }
    3 }) J1 ^# f9 P9 e( `# @
复制代码
用户页面( b# n5 S* {, J

html

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

javascript

  1. var img = document.getElementById("liveImg");
    ; q$ S5 R% X( ^. U7 z( z
  2.     const socket = new WebSocket("ws://lm.com:9502");& a/ I7 d" l- v9 i  e+ L/ d, f1 W
  3.     //
    8 g- c: ~4 K6 B; V
  4.     socket.addEventListener('open',function(){  r# v2 K, A. H- [- d, S& T
  5.      socket.send('Hello Server! Im live.html');4 S# ]& M7 H1 M
  6.     });
    " \3 D+ x+ m# g$ k
  7.      // Listen for messages3 }4 i- p, u2 {1 H' n7 ?0 y- Z
  8.     socket.addEventListener('message', function (event) {
    , a" I0 `# H1 r; }
  9.         //图片地址
    1 `* n7 E3 W1 ]- h* |3 m+ x
  10.         img.src = event.data;+ L9 |( g* Y6 L6 A& r9 |
  11.     });
    # I# b8 O0 p! H9 n2 i
复制代码

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

+ {  Z' F, `( o6 u, w+ `8 f
0 `1 R# ^6 B5 O8 N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-5-2 13:31 , Processed in 0.056464 second(s), 20 queries .

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