管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器
; c9 I% H% Z v0 E% Z- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1);
6 P1 ?, I2 m, _ n, p& p/ ^ - //创建socket服务, h0 S# G* O7 u& h% `" k( N, a
- $ws = new swoole_websocket_server("0.0.0.0", 9502);6 M$ _+ V- L2 x0 g
- //监听WebSocket连接打开事件
1 J: I/ b' ]( h, h - $ws->on('open', function ($ws, $request) {+ {7 j, N6 M. E; Q" \7 n# b$ I8 f
- var_dump($request->fd, $request->get, $request->server);" z/ R9 M6 B4 \( S) X; c
- $ws->push($request->fd, "hello, welcome\n");
) B4 Q1 e9 N S5 d9 o' a% V - });% m9 X4 Z/ a4 \' H/ N
- : W2 v* q; @$ N5 s! Q5 d' R
- //监听WebSocket消息事件7 `8 Z* L* Z1 y/ g
- $ws->on('message', function ($ws, $frame) {
% F3 X/ z: S4 a& E; R - //推送消息给所有用户
1 s" b3 l [7 R7 f! S2 L. L - foreach($ws->connections as $fd){; Y3 P3 b% C$ x6 n+ a
- $ws->push($fd, $frame->data);8 g) l1 t6 l- ?9 k) t4 ~
- }
2 }# a' y! d: F+ Q7 A1 r - });
7 r0 }! `( I" R: z8 w" M2 n
, Q8 H) j& W# Q4 D6 } ?- //监听WebSocket连接关闭事件8 a2 q# v4 M; s& X9 s3 v
- $ws->on('close', function ($ws, $fd) {! H/ _- \4 h2 E+ C; m5 I+ U, z
- echo "client-{$fd} is closed\n";
7 x/ H: _5 c3 _1 m) W3 L3 s5 C - });
- G1 S; {0 [3 S+ D. m) m, o - //启动服务
6 d8 J. Z) {" j* c: c" b - $ws->start();
4 S' `2 Z' q$ | - & T" I5 T, f0 l
复制代码
, x2 B1 k0 _3 A9 ~ y, FWebsocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端
4 E- Z) n) t: R代码如下 - //连接服务器
+ k. |6 Y9 X8 u1 T - const socket = new WebSocket('ws://lm.com:9502');
$ ~7 r3 Q$ i# @ - //Connection opened
6 S; k4 z; ^$ d- Z; G4 s7 B/ B, u6 @ - socket.addEventListener('open', function (event) {! i2 |* {. m" g
- //发送消息给服务器0 q# l+ n5 |8 w& {( ?. L# Q
- socket.send('Hello Server! im websockt');
! C7 ~1 `, S- r2 e* J - });/ d% x# }% x7 m
- // Listen for messages7 m. {: [3 O% q- E; j$ [" Y
- socket.addEventListener('message', function (event) {
, T4 t4 f2 J3 t$ w! A- j4 G6 i7 R - //接收服务器返回信息
% A q% C5 n; R) k6 H - console.log('Message from server ', event.data);* V6 J# o; a9 \# q5 N: w" l; b% U
- });
) d; ~' \7 H- D0 K5 a! _ - + Z% p5 |9 i; c
复制代码 伪直播主播页面
6 E3 q6 F7 o1 y; s( z& x/ Ahtml - <body>
g7 O5 K* `! {. J+ L/ { - <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>6 q! }) ] R% n4 N" j: Q
- <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
: f5 E6 U. z. s) ?7 b: \# F6 N! Q2 ? - 画布
' `- C! \# V& ~/ a- H - </canvas>! T# d+ V: ?* b4 g
- <img src="" id="videoImage" width="350" height="700">* E: o( B$ v/ y% T2 B" j V# A
- <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
- P, I, ^: h" o& b' C$ w8 J9 n( D - <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>9 v- u) Z/ N* k; \+ L% A( w( E
- </body>
B$ d. M3 m7 a! y) C
复制代码javascript - var v = document.getElementById("myVideo"); \ ]6 N1 Q3 R
- var c = document.getElementById("myCanvas");
/ ]( ]- ?& q/ | t - // var c = document.createElement("canvas");7 {+ @ a: f' R. w& t( L' A8 [
- var img = document.getElementById("videoImage");
2 L, W2 Y( k! d. y q# B( D - ctx = c.getContext('2d');
0 Z: z& T; O1 T+ ~2 d2 Q - var dataUrl;
: V7 l/ j5 y* r5 |$ Z' L( l - const socket = new WebSocket('ws://xxxx.com:9502');
, q- `1 v% }* j& f - //Connection opened. I% b7 o! I1 J* L* f1 `
- socket.addEventListener('open', function (event) {1 W3 O. Q6 ]2 y K4 W' V
- // socket.send('Hello Server! im websockt');* S5 U2 B1 }6 B. I
- });
9 ~5 g$ Q0 U' i4 g i; M6 F5 P - // Listen for messages6 [' j% h0 l+ ?# ]" S5 J( U
- socket.addEventListener('message', function (event) {
8 F6 ?& s# m/ u4 |' S9 p - console.log('Message from server ', event.data);. @- |6 S4 K! U5 O" r% [- O9 o
- img.src = event.data;+ `9 X4 g9 r7 q# q/ }
- });+ L6 g1 K; a' { u
- 1 J. B/ {" U% u- T. o6 o
- function playVideo() {5 I4 t; D3 I R! ~0 W9 i q* C
- ctx.drawImage(v, 0, 0, 350, 700);1 v8 z# ^3 R: P% K
- dataUrl = c.toDataURL("image/png");
! I! x; k- w1 h. T4 P - // img.src = dataUrl;
' J: }' x3 c3 w% k' W$ w$ n - socket.send(dataUrl);7 E" D, O' L9 f; D" T* w, Q; a
- }
/ e1 V5 ]. j7 X - var tick;
7 t! [8 m( u9 R$ e' e - function aphla() {
( x1 j# x) t# y" N$ r! Y% O9 G - tick = setInterval(function () {
+ Z: [# p0 N4 _0 Q - playVideo();
# _, `& m/ s0 v) M8 t3 w( P - }, 1);
' U& Y( ]5 S8 @! [; M* N - }: C% H1 J5 a( L# j) E9 u+ }& h" Y
- function vdStop() {
) c4 i" Z% L. _) @* P - clearInterval(tick);' p4 B; D" w: P2 g) \) L, a
- }* [" V4 x5 |+ |
复制代码 用户页面& y' B# h' k% A0 V3 T+ Z* Q' E. k
html - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");' v" ^/ W7 @7 G
- const socket = new WebSocket("ws://lm.com:9502");: E9 @3 T1 e G! v- o6 b' a: J
- //# N2 S$ P$ O( L& r1 m
- socket.addEventListener('open',function(){
/ v0 Z9 A8 q- G# O% Y. s - socket.send('Hello Server! Im live.html');
. a" g8 N& C# g, l - });$ Y4 Q0 V& |7 p* c, [+ ^' o; O
- // Listen for messages' @& C7 Y& a3 w1 y5 W' |
- socket.addEventListener('message', function (event) {
* l3 o& o2 V9 G# B% | - //图片地址1 u2 l! }0 i3 E5 r1 d( O3 X" X4 m
- img.src = event.data;0 x& H% X/ ~5 E/ L
- });
3 ` ~5 L5 M: x! X+ h
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法
' P" ]) S- Z9 R8 `% o" X+ S! B+ m2 s" J1 n; x8 d- K
|
|