管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器, R0 `; Q$ ^- Z
- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1);
& y) J( x! G8 l - //创建socket服务
: }2 ^& u o% i- S - $ws = new swoole_websocket_server("0.0.0.0", 9502);
" D/ x2 Y8 N4 Y A& u - //监听WebSocket连接打开事件/ O$ T5 Z- L; Y6 I7 f
- $ws->on('open', function ($ws, $request) {
4 V! |5 t# w# ] V% { y# Z - var_dump($request->fd, $request->get, $request->server);8 R- X+ a, X/ e3 \& {! V! T
- $ws->push($request->fd, "hello, welcome\n");) k5 q3 a u& J0 }
- });
' Y0 ~, |: ~ _! P - " o; f1 R6 ]1 h0 m
- //监听WebSocket消息事件: q& }0 }. I+ E2 ?
- $ws->on('message', function ($ws, $frame) {* O7 H- f0 `, U& g3 P: m8 A
- //推送消息给所有用户
1 C7 N& M/ Y5 ]) U - foreach($ws->connections as $fd){
! M* a1 x5 B' d- d9 v3 P: w - $ws->push($fd, $frame->data);
. `3 V9 s. J6 P) ?2 M1 `8 w6 n - }% m; y* j# o" @1 v5 b
- });8 A" l6 J' b% }6 ]& j) d9 W
- ( [9 `+ _% S# p# i
- //监听WebSocket连接关闭事件
2 @$ w! p' |* M1 K, M$ T* b8 v - $ws->on('close', function ($ws, $fd) {3 _" ?& `% J: ^% B
- echo "client-{$fd} is closed\n";
# `3 d* y- U& j2 k8 [0 s - });
0 {& d! |* X) s& f. O - //启动服务6 q8 L# h" h/ ^) \
- $ws->start();0 O+ V. M! W( a g
( a, _+ t. f( B; c }4 }0 H
复制代码 . n% `1 `! r0 _8 U' C' _" o, i
Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端
- q, b6 B9 _+ _: w2 r0 Q代码如下 - //连接服务器$ i* Q G V. y% L4 o
- const socket = new WebSocket('ws://lm.com:9502');) n3 u* T" x$ J
- //Connection opened) c$ M7 n2 W' u: K
- socket.addEventListener('open', function (event) {
# q: D$ L* d3 ]/ c6 X - //发送消息给服务器
, x2 `, b# b2 |) ~ - socket.send('Hello Server! im websockt');6 Y3 p- w$ K9 z0 r
- });
6 |: m& _$ @/ o) \1 F4 _* O - // Listen for messages
. y4 n6 c0 r( A% L6 P0 C a L - socket.addEventListener('message', function (event) {2 G* b$ b9 W9 p/ \& {
- //接收服务器返回信息
6 O9 E; R$ o' r D. p5 R% g p* C - console.log('Message from server ', event.data);& V. |9 ~2 a8 q% _# w. b
- });/ p# g8 M5 i) ~$ `
* b5 l9 W- ~% ?
复制代码 伪直播主播页面4 }- ~4 t0 H" ~0 w, J/ t) W7 W; k
html - <body>
' P# ^( b, h2 H' E - <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
; { D4 X7 j% ~ - <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
1 k' t5 K- V# `& A - 画布! ^9 `; [2 h' ^$ Z+ r1 O
- </canvas>& r8 I4 W2 ]7 P2 ~ r9 }
- <img src="" id="videoImage" width="350" height="700"> @1 m! P- b/ N# n1 Z
- <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button> T3 f h( ]3 Q" [
- <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
9 S% U& h( N& [4 \/ a - </body>
8 f( s; {* N2 W- y4 o. _5 k' K* ~# }
复制代码javascript - var v = document.getElementById("myVideo");
5 i0 R; }+ y V0 [5 P - var c = document.getElementById("myCanvas");
7 s) N$ D" C2 U7 m8 | - // var c = document.createElement("canvas");1 f3 W, B. J3 ?! L
- var img = document.getElementById("videoImage");
u# [ _5 u/ P; P( Z. k# [. N - ctx = c.getContext('2d');
1 C5 X7 S; s" j: Z# Y; z - var dataUrl;/ N/ V' U0 V4 n5 U
- const socket = new WebSocket('ws://xxxx.com:9502');
4 P1 D* t/ j3 l! S6 y9 A - //Connection opened0 B/ u5 a5 J! d4 g
- socket.addEventListener('open', function (event) {* G5 k" X8 b* C) Q7 ]
- // socket.send('Hello Server! im websockt');
0 \0 s/ i+ k0 g - });: h$ @% T5 N0 U) d3 y0 O) g
- // Listen for messages3 F6 U9 B7 Y& \/ r3 W3 p: F
- socket.addEventListener('message', function (event) {- V( ^8 k9 s6 Q* N$ K% e
- console.log('Message from server ', event.data);: [! i% E1 d( z5 c* U: ]
- img.src = event.data;
, n- [" X+ M1 k0 e9 d0 f6 V - });
$ h" i7 Z# a/ u9 B4 j
. k& r2 `8 \. f, z/ G- function playVideo() {0 z9 t5 A9 S8 ~3 j- C4 s: X
- ctx.drawImage(v, 0, 0, 350, 700);
# ?) T9 J4 m0 Q/ U3 o ?1 ? - dataUrl = c.toDataURL("image/png");
6 v% |/ S0 d: M6 l - // img.src = dataUrl;5 r+ f# h7 g. }# Y$ y
- socket.send(dataUrl);- g, [; A! |% M% K5 o' t2 V
- }
3 M8 M+ K) m9 r3 C9 i) D - var tick;( k+ X+ T% Q; d
- function aphla() {3 b5 c3 c; m$ h* y
- tick = setInterval(function () {/ b* u, ?: r- Z2 D, ^
- playVideo();
1 ^0 u& m. B( a7 e. X9 s6 r+ _# o - }, 1);
0 u3 q- u5 @# Y5 \6 X/ Z! N k8 k - }6 o. S' O3 T4 R8 w3 g/ D
- function vdStop() {
4 r1 m1 A e2 f5 ?$ N4 P/ ` Z: Z- {( m - clearInterval(tick);
, _7 e! J7 M' F9 w - }
6 v8 Z8 }' C5 i+ F( J
复制代码 用户页面
, @2 c' @, `( P9 [* d$ Zhtml - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");
. ?3 Z. }& i9 Y) K3 u - const socket = new WebSocket("ws://lm.com:9502");
# b S6 s* N2 F$ s. U1 i1 q - //- U6 m0 h" q9 [% Z$ R& D( t
- socket.addEventListener('open',function(){3 n8 X! J/ z# l2 U
- socket.send('Hello Server! Im live.html');
+ i. P8 H6 W$ {7 v- {2 k9 O - });: \2 t3 V. P6 r' l4 f% w L
- // Listen for messages% e x3 t, `* U; l; i0 S- o
- socket.addEventListener('message', function (event) {
, \+ ?' `6 z- j5 x" }; f - //图片地址5 A+ r; K1 X; c0 T2 X
- img.src = event.data;
) `1 A, Z/ Y: ?: s+ S9 i$ S4 y - });9 l) T% ]* E. Q3 R/ j
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法
, ^/ [3 A( q) w) y: s/ ?) ?3 C5 z1 S
- b0 Q+ R2 g1 R# t$ p |
|