管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器
Q* |* d. P5 Y' T9 N9 i- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1);
' b5 z2 i: M2 Y' o g0 U. Q - //创建socket服务- s) `8 X1 ?9 ~ _7 G+ Q
- $ws = new swoole_websocket_server("0.0.0.0", 9502);
8 O( s! l9 o) Q* X - //监听WebSocket连接打开事件
. l9 i0 |: p" |6 b8 ~ - $ws->on('open', function ($ws, $request) {
2 R" \. R) | C' Q a - var_dump($request->fd, $request->get, $request->server);: M8 n1 _+ ^0 _; y- T: H: w
- $ws->push($request->fd, "hello, welcome\n");" \4 g. K; O3 l' n9 A
- });5 Q7 q# }0 z m
' H; }. o0 R! t! a# r' P- //监听WebSocket消息事件
3 Z( f5 D+ z$ F - $ws->on('message', function ($ws, $frame) {
# ?6 H/ i* |% y2 E6 x - //推送消息给所有用户4 [9 d5 |$ t! D7 T7 p
- foreach($ws->connections as $fd){
. @- E" [2 A+ X, S. R0 C - $ws->push($fd, $frame->data);
- a, d: P& a( w6 k0 Y, n - }% e9 O) A' p9 @1 T1 _, ]5 g
- });
% o6 @4 F& u) R4 z5 }8 `( r& S2 f" l7 e
4 l; M6 b7 F# g- //监听WebSocket连接关闭事件' m8 ^* I) |$ |) R
- $ws->on('close', function ($ws, $fd) {
9 D; L a! ]5 T, M& \ - echo "client-{$fd} is closed\n";" Q3 O: P7 n9 e5 W
- });
- S/ e( m# X+ h5 b( \ - //启动服务
8 W3 |. P, o1 t5 F' c! L+ { P$ y - $ws->start();) J2 q. e7 q9 M G
+ u4 Y( ^+ T% v4 h6 g
复制代码 7 i: g8 g& C" G0 p
Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端7 l6 }: X% G0 d9 O. H$ m
代码如下 - //连接服务器! h+ S/ ^* z% q% u& W0 @( D9 m) w
- const socket = new WebSocket('ws://lm.com:9502');9 }7 V: X5 b7 o4 ]
- //Connection opened
( N7 ~$ C# b3 E0 g# v9 J& L - socket.addEventListener('open', function (event) {
& _# _' m" T2 F, {) ]( J - //发送消息给服务器
9 F6 l: V6 s: f' c$ _* W; n9 W; p - socket.send('Hello Server! im websockt');
3 X( g( J& J4 l4 b, F( l4 G0 n1 x - });
8 O8 I3 m* e" ^2 X9 {; |( `9 s! I - // Listen for messages
( q% z; I4 S$ i7 Y - socket.addEventListener('message', function (event) {
# p c: c# C3 t1 r" \# H - //接收服务器返回信息- B+ v5 {: Q" R2 z9 |0 e
- console.log('Message from server ', event.data);
9 j! j# T1 L( H( F% [6 }+ R - });
8 h6 _+ @- p* C, K. D$ @
8 g8 |! J# Q' z; @' Z: o, S" W
复制代码 伪直播主播页面
" H& R+ t0 K+ x7 l8 S* xhtml - <body>3 n. X. `. |2 U2 X* ]+ u( s
- <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>. _6 H. R; C' u4 j9 o
- <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">: d+ b9 O. k8 T( [- j5 r' b2 U2 @0 ~
- 画布
/ P8 A! U5 z$ e+ J - </canvas>
+ O# ~3 h) u4 w - <img src="" id="videoImage" width="350" height="700">0 z e4 e& U' f# _$ @
- <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>; R- Y, F$ I0 G
- <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
. _+ }% }# @7 V4 S1 i6 ~' C - </body>8 Q5 {% ]0 F- I# x
复制代码javascript - var v = document.getElementById("myVideo");" K0 e; D: y# @; {$ x
- var c = document.getElementById("myCanvas");
% A& D' J8 u. ^6 }& G6 Y - // var c = document.createElement("canvas");: y [& f* S( ?
- var img = document.getElementById("videoImage");
3 }: _/ I+ X: t& Z) u7 H - ctx = c.getContext('2d'); [+ ~, q" u$ D3 C
- var dataUrl;, x% c1 X7 C, v
- const socket = new WebSocket('ws://xxxx.com:9502');
2 F) e+ C& a' a+ U - //Connection opened# b. T( U7 o5 ^+ t- b) _9 q
- socket.addEventListener('open', function (event) {9 u5 L% d" o1 p3 H3 y
- // socket.send('Hello Server! im websockt');( b. L7 {/ ]- d2 E
- });6 `- E. C( G" M g; f
- // Listen for messages9 y8 z- z2 a" p0 E9 _
- socket.addEventListener('message', function (event) {/ P% }' k& F* i7 L
- console.log('Message from server ', event.data);
2 H& P9 I" k- |0 { Y - img.src = event.data;' `4 W3 c0 O( Z3 Z
- });& P! }% { m% d' @
- ) r3 c) o- k( O! [ t$ r
- function playVideo() {
" u) }0 F" j" F - ctx.drawImage(v, 0, 0, 350, 700);. D, b: x1 l" t/ s; m8 p( ~8 |
- dataUrl = c.toDataURL("image/png");- Z, B+ n/ ]% F$ D" v4 L8 d
- // img.src = dataUrl;6 M. x8 i6 \9 _1 J. @! C7 _
- socket.send(dataUrl);/ k) V+ P/ H/ Y( A) W& j. s( L& J
- }
* @9 a$ R# [+ y% _4 `7 ~5 L4 u$ x - var tick;
; O6 Q4 S" W+ w5 x - function aphla() {
& _; C: Q; R- V% N8 [+ z6 n3 m1 L - tick = setInterval(function () {
4 M* b/ ]4 B/ g e( d. `2 N - playVideo();
5 ^2 V$ b. O+ i. Q* F- ^ - }, 1);! j; V" o/ s9 M
- }
, I3 M2 U$ }- a5 s# {; d1 s+ H$ M - function vdStop() {/ J u& I$ F& ?4 W6 h3 Y
- clearInterval(tick);2 c) V- E- R- x; o2 f3 v6 C, S
- }
+ {( ]' N8 A) i& g8 s, f: G
复制代码 用户页面8 E, _7 C4 H$ u5 U* |8 f
html - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");/ u3 M6 t5 `8 r0 `
- const socket = new WebSocket("ws://lm.com:9502");
3 E: j* m5 o2 {, ~ - //
; b! r. H* \+ O' Z0 M( W/ P) [ - socket.addEventListener('open',function(){
: t) u2 n+ `, v - socket.send('Hello Server! Im live.html');
0 D) e1 Y- z K; ` - });
9 {9 I6 r: ]' a( [% J. C: K - // Listen for messages
+ s; Q* P" ]; n7 D2 S+ ]1 u - socket.addEventListener('message', function (event) {* h% Q2 R7 j5 h* `+ ~) B
- //图片地址" u1 x6 B/ L" z+ q2 m
- img.src = event.data;
: t" E9 }" g5 |/ o( E - });8 z X8 G/ g) j/ r7 p
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法 7 F- \6 z& O# o. C' D
2 s1 P& z- x) b0 @1 z+ ~) I |
|