管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器
$ x' u' B; n4 O. O- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1);
- X, D9 ~, b. |( a - //创建socket服务
' Q: h2 E9 [7 m; w3 D/ z0 Q - $ws = new swoole_websocket_server("0.0.0.0", 9502);( e/ M/ v* I1 {+ t5 x
- //监听WebSocket连接打开事件
5 [; L: F3 Z. P$ | - $ws->on('open', function ($ws, $request) {; I- b" H# C* h
- var_dump($request->fd, $request->get, $request->server);
7 ?6 ?0 u3 [" u - $ws->push($request->fd, "hello, welcome\n");/ M8 H( ^2 r% i: q! f$ S( Z3 m
- });9 W- b: B; j/ N+ A) R
- : P; o B1 u" O, T6 o) ~/ x$ f
- //监听WebSocket消息事件
' P `- [/ ^9 e$ P - $ws->on('message', function ($ws, $frame) {; B( @& n: \+ u6 V s
- //推送消息给所有用户( ?& E X. I s2 g5 c6 W5 e) k
- foreach($ws->connections as $fd){
h4 B8 [. z4 G! _3 g - $ws->push($fd, $frame->data);5 d- S+ |7 {5 ^6 A$ f. F, ~. ^8 \4 M
- }
9 i' _$ [# \3 U% m$ W7 Q - });2 r4 J& t, k( Y1 H; r
- ! F8 M3 E& V! E4 h& D# C8 y
- //监听WebSocket连接关闭事件4 l& k2 V, H1 L9 `. Q
- $ws->on('close', function ($ws, $fd) {* |7 ?5 s. p5 L. V2 `+ g) R
- echo "client-{$fd} is closed\n";. O' w. R/ ?( u9 Y0 C
- });
4 H3 ~" E9 E- F C" _6 K - //启动服务% Z/ u$ V2 R5 z! U
- $ws->start();
- @/ K) W0 [% p2 H - 1 |3 Q5 G, E/ r: W( i& c% F
复制代码
1 K) y1 e- ` t5 q; _0 A- a3 _Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端, A, q1 v2 Z% m9 ?$ D
代码如下 - //连接服务器
+ @5 E: m, W6 T" I, |' z$ ?9 ~8 K - const socket = new WebSocket('ws://lm.com:9502');
9 j* A; W+ V$ R0 v1 _/ S - //Connection opened8 N2 U) v0 P/ D4 o; ~% H/ B) g
- socket.addEventListener('open', function (event) { E2 ?8 a! N, O- B, X& V7 h* t& K
- //发送消息给服务器2 E8 ], H6 G/ `' u
- socket.send('Hello Server! im websockt');
8 O! ] w: ~! C; r# E5 ` - });
- ]% E4 ?) b; n8 [7 d - // Listen for messages1 a9 M, a" r+ v3 r7 E+ f& @
- socket.addEventListener('message', function (event) {$ q N# ]0 u- E$ g
- //接收服务器返回信息
+ d7 A" [8 Q/ k5 r0 |# l - console.log('Message from server ', event.data);
; T- J9 g6 X1 ]& m% h - });2 @! c, `: e4 g
- 8 }% t$ I: @2 X" l) T
复制代码 伪直播主播页面
% L3 n" `0 X6 b" x$ ]. H/ thtml - <body># u9 N" z% J5 `( E, t% k/ B! r
- <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
6 ?# G3 o! P" u' p! l9 u9 e7 F - <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
K2 W, z5 W& {9 e5 |9 M- a3 t. B - 画布* o; Y; I; `/ M, t% \
- </canvas>/ Q) ?, t* H' ?' u: z! Q
- <img src="" id="videoImage" width="350" height="700">9 S6 {* j: h% @4 I& u& p
- <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>) F3 y, c e R- X2 b. [1 Q: H
- <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>$ H9 \1 w/ S/ a( D6 M# K! R' m
- </body>
; t0 o# Q3 b- o: D6 | N0 F( |
复制代码javascript - var v = document.getElementById("myVideo");- O, f6 u. [5 t
- var c = document.getElementById("myCanvas");
; L) W. Y+ F% Y7 b/ ] - // var c = document.createElement("canvas");- _) }7 [. g+ m' I' [6 ]# e
- var img = document.getElementById("videoImage");, t3 [4 P: e% y( C, q3 h
- ctx = c.getContext('2d');
- \& r. r% |3 B V& o, D - var dataUrl;! a8 U% F$ h6 D( J, c( G- p/ M* h4 L( E
- const socket = new WebSocket('ws://xxxx.com:9502');8 D/ b) u) X1 S! K) [" W2 Y
- //Connection opened" r' Z# V. n+ } i* P! I) j1 ?1 P
- socket.addEventListener('open', function (event) {9 \$ n7 U! M5 j9 _
- // socket.send('Hello Server! im websockt'); N' A$ K( [6 `2 T7 g
- });
# D# c7 e1 F$ @9 U8 H, k; J - // Listen for messages* A& t1 q* a* U& M& [9 z
- socket.addEventListener('message', function (event) {
8 N9 s+ S. J; p0 Q - console.log('Message from server ', event.data);
! }. P0 d6 A+ } - img.src = event.data;
4 b& c, g; |% {4 B' E" t - });
, m4 k; f; r6 Y% P- t1 V
2 f/ c+ I4 `* K/ S+ R/ o- function playVideo() {4 b9 Q1 Z1 G9 `" n* \* [, {
- ctx.drawImage(v, 0, 0, 350, 700);1 N! @6 s% f' H
- dataUrl = c.toDataURL("image/png");: x* e+ q$ A* X! G) ?" p. I
- // img.src = dataUrl;! h; A. K# J* Y+ S6 F% v' s
- socket.send(dataUrl);
4 ~6 J7 q. F: A+ b - }: b7 G9 B0 B& J1 |
- var tick;" d1 x/ A$ U" n# A+ c+ I
- function aphla() {4 X4 R: b7 ~& [! K
- tick = setInterval(function () {+ o2 L6 f* p3 X) Z- G8 M
- playVideo();9 i+ k$ N7 o- v3 q
- }, 1);
0 p/ y! j1 X) e! V - }
# d4 h- U7 U' F9 m$ s - function vdStop() {
/ @ N" M, C' M, o/ p, D. g - clearInterval(tick);% e" G! c e3 O2 ]& N9 E# d# u4 H2 u/ ~
- }
3 p% U% r8 m4 a) k. n) ~
复制代码 用户页面
, m4 ^. m, b) u7 }html - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");
7 ~2 R. O9 R" ^: s7 n; J - const socket = new WebSocket("ws://lm.com:9502");3 T% e) @6 a) [. c% _0 ^
- //
6 s, ^' L! Z: C9 v7 v; D - socket.addEventListener('open',function(){
2 m, N: j% K+ e* \+ y h7 o - socket.send('Hello Server! Im live.html');
: ]7 i" _; B. b7 t) A; Q+ E+ a - });
& m8 E _: |! m/ V3 t - // Listen for messages
$ c6 Z* f2 i: |+ {7 P6 A - socket.addEventListener('message', function (event) {* C7 b" W6 y% a- B1 X
- //图片地址
" n7 }: J6 C& f& ] - img.src = event.data;
" |: t' H) S7 t0 Z6 @% c - });* u* G% |# {' D1 Y8 f
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法 ?4 D6 z3 O8 G4 U0 X, E
( | O0 q+ x. D7 I ^ |
|