管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器. t. M" ]* ]- I
- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1); % \2 b* _5 [( H
- //创建socket服务
) H3 T Z+ _8 Z+ P - $ws = new swoole_websocket_server("0.0.0.0", 9502);3 h! N$ l2 O( B8 ?* h
- //监听WebSocket连接打开事件
" @. P( O' [- S2 T8 V - $ws->on('open', function ($ws, $request) {# H6 W1 Y2 R; `+ a
- var_dump($request->fd, $request->get, $request->server);
; F5 d3 T) ?3 |5 [ - $ws->push($request->fd, "hello, welcome\n");9 W' f1 i% N7 T' }0 B& H8 y% m
- });' Y2 z3 ?' c: \$ ?
) ~' n0 d; a- o) t- //监听WebSocket消息事件
( L+ b3 S5 z8 t8 a; A8 F - $ws->on('message', function ($ws, $frame) {
! V' r9 ^, m4 `+ @# r8 I3 @ - //推送消息给所有用户
5 o( Q0 T5 u7 e U8 e! u3 c - foreach($ws->connections as $fd){
* u1 m r. g; Z' t+ a; T- I+ T - $ws->push($fd, $frame->data);
3 O2 z. J" M1 z - }
: j, I- s" U. H0 Y5 [3 Z6 G - });
# r( [% B: k) Q/ i. U. j
t1 a8 e6 _; M7 F- //监听WebSocket连接关闭事件
7 K! \& L7 h& ]: j5 }! f - $ws->on('close', function ($ws, $fd) {8 D) h- s3 m9 Z
- echo "client-{$fd} is closed\n";
( ^7 P! b& b1 ^" g - });, {9 Z2 K3 G0 ]9 B4 a
- //启动服务
- Z3 u: u( j( G+ H4 d. ] - $ws->start();
& b# n4 e% z. v* s/ n! W) h- _1 c5 {4 ] - . ?) k4 ^% O/ I& n" F! F
复制代码 4 S! _9 ^7 \ `- ?/ l
Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端( d. V/ B8 u+ W
代码如下 - //连接服务器
9 ?$ e: e8 N+ l9 B - const socket = new WebSocket('ws://lm.com:9502');
1 X8 R0 Y& O5 W3 C+ P$ m - //Connection opened
" Q+ x& d8 J5 d6 \% } - socket.addEventListener('open', function (event) {6 h1 `6 p# T+ N3 v M% j2 o5 w
- //发送消息给服务器6 V9 b9 q: ~5 K2 k2 P5 j
- socket.send('Hello Server! im websockt');8 W, V5 a' L) t- b4 u$ y! s
- });
/ J O' n0 ~' J, P$ a# P: q - // Listen for messages
- G* v% O: j( \ - socket.addEventListener('message', function (event) {- V: o5 B0 {* |+ O7 G
- //接收服务器返回信息7 O0 i/ L% f5 d6 b9 B5 O9 y) p' \
- console.log('Message from server ', event.data);
3 _. H! j& o% L" F - });
: \" X+ z7 ?# _+ H% J0 d - 1 f: V d* I# n9 Q! @: m
复制代码 伪直播主播页面: P) @; ^+ A P) U( _0 M
html - <body>
; S. k& I n* ]. @ - <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
1 f2 g/ r$ R6 S - <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
( _( v: |+ @9 S( T/ T* j7 O* q - 画布
- Z8 b7 [+ \8 } - </canvas>- ]9 S$ e- o8 J. X6 `
- <img src="" id="videoImage" width="350" height="700">
# q9 P% E/ W3 ? - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
$ Q( [( r' W! m3 K g* L f - <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>6 F* b: ]. M$ ]9 p* p4 {: A
- </body># p, }) g3 e. b0 Z* x3 k. X" q2 y
复制代码javascript - var v = document.getElementById("myVideo");) y. N1 A R8 v0 b8 f
- var c = document.getElementById("myCanvas");, m9 _$ e r$ ~
- // var c = document.createElement("canvas");
3 F3 d e; t$ m. s+ Q$ A - var img = document.getElementById("videoImage");! ~, b# V% k; |# J4 K- p! a
- ctx = c.getContext('2d');2 _- U8 l) x' D, }
- var dataUrl;% t+ ?# ]: p$ Z$ A
- const socket = new WebSocket('ws://xxxx.com:9502');4 Q6 I% l3 O6 w4 s
- //Connection opened
: O/ v$ \' r' _5 a- R7 q- @ - socket.addEventListener('open', function (event) {
. k; |! T% |' s) c% K/ f - // socket.send('Hello Server! im websockt');3 X/ V8 v7 o1 W6 {* @$ p
- }); T; i3 a- L& s
- // Listen for messages; O/ Q. O4 N5 g! i5 p
- socket.addEventListener('message', function (event) {
$ i* h" p: U: I. z3 a6 P0 l+ Q - console.log('Message from server ', event.data);
3 R5 Q Y/ }* r9 } - img.src = event.data;; d2 n) }7 q9 [! M3 y/ z
- });
6 {8 ^2 c9 @, ~
. n4 {! ]3 N% A: R- function playVideo() {+ Z$ \) Y# w! R5 B
- ctx.drawImage(v, 0, 0, 350, 700);4 C* B. A: k: M6 h4 w) ]- h
- dataUrl = c.toDataURL("image/png");
5 E Y9 g0 r$ o5 k+ ~# n" K - // img.src = dataUrl;6 a: ~* |1 `1 {$ q% n8 O5 i6 K/ R
- socket.send(dataUrl);
: p- T% I& a$ ^/ U' Z+ Z& X - }5 s5 i' z3 `0 k
- var tick;
% {! r3 O% a+ g5 W1 L - function aphla() {
: N9 [# v5 u2 S% R: U - tick = setInterval(function () {3 M! I& l# c9 ]
- playVideo();
6 u! G4 ^& a1 H( g8 W; J - }, 1);
3 ^( j* H# a$ u6 c/ I _ - }
* B8 W- S. Q0 t$ P7 J( n - function vdStop() {) }6 x& h" Z+ f* b1 |: _# o
- clearInterval(tick);
\- w7 W9 [! N" f5 M* e - }" \2 F! K! ]+ B) L
复制代码 用户页面, j& f( W* p1 {" I+ d! ~( H
html - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");4 F$ C+ \; @! L% }
- const socket = new WebSocket("ws://lm.com:9502");# o6 w$ Z# g, z7 _2 \: {4 @
- //& V/ E& L7 y& q6 x- D# V) x+ b
- socket.addEventListener('open',function(){% u' Y3 h, B' D5 p
- socket.send('Hello Server! Im live.html');( E7 e$ B4 J' ?; {$ W; ~
- }); U4 I1 o- z7 G6 d
- // Listen for messages* [& s" a+ l7 J; Y: Q
- socket.addEventListener('message', function (event) {& o9 B, Q% o3 w* A6 ~
- //图片地址
+ D5 T) t6 T. ]9 N( I1 q - img.src = event.data;; a2 s1 b, ~( o) v( ?! K4 t
- });6 N8 ?$ J$ j k7 `5 S3 p j
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法
5 O3 t. `2 F" g8 G
7 H, J6 v* G4 I2 i$ m/ z) i ~ |
|