管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器
( T0 S/ ^2 N2 W: ?4 w- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1); " d- ^& I4 [ i; u
- //创建socket服务5 N+ @- }( l. K8 `) k/ t
- $ws = new swoole_websocket_server("0.0.0.0", 9502);
. M, b- `- R) d9 E: C - //监听WebSocket连接打开事件
7 `, B4 Z# Y7 ?+ @ - $ws->on('open', function ($ws, $request) {) t) b! x9 |. [0 n/ v/ _" p3 S- R
- var_dump($request->fd, $request->get, $request->server); ~* M; A7 l- b/ K5 {7 ^+ @3 ^
- $ws->push($request->fd, "hello, welcome\n");% W- I& ]6 e4 H, z
- });0 ~1 Y1 Z1 C+ x$ @
2 |% H6 f! ~* L' y9 K& N% H9 M* `- //监听WebSocket消息事件# S% n& I3 I. b0 j! O& h* R1 b
- $ws->on('message', function ($ws, $frame) {1 H ~0 n' e) {0 I$ t1 k1 F
- //推送消息给所有用户
- Y3 W/ ]( | n3 K1 g2 \ - foreach($ws->connections as $fd){
2 V$ J% C) X& F2 t - $ws->push($fd, $frame->data);: e1 `( K+ p2 m! i8 r3 r
- }$ M2 j) Q' v4 K$ D& i4 a
- });
: E- R1 R( M1 Y: K- Q) T
" E5 C p% z0 [+ y- f; g- //监听WebSocket连接关闭事件
* h- p' R9 h7 T: L# p - $ws->on('close', function ($ws, $fd) {* @, c8 x; e3 H Q6 v% U- s! A$ a
- echo "client-{$fd} is closed\n";- j5 z+ ?. l* B5 x. [% q* m
- });5 [* w7 A! _9 ~' \" U9 U
- //启动服务
. |; V+ r* k& a6 l, B6 A - $ws->start();, N7 x0 k8 @4 n( [' S
- d3 A0 M0 B0 s
复制代码 , e' g9 _# q" Z( @2 R) A
Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端
* z. w3 Z* I L5 F4 H代码如下 - //连接服务器! n1 u' N/ d; G E. E3 X- L9 S6 `
- const socket = new WebSocket('ws://lm.com:9502');3 d* R. J8 L4 j8 f
- //Connection opened7 g" P7 j. y0 G. ]5 U0 ~1 z& B
- socket.addEventListener('open', function (event) {
0 G8 P0 \- [- S5 o% k% t: o - //发送消息给服务器
7 H( [: H. G: F [9 M - socket.send('Hello Server! im websockt');# s- {, i& {, E4 M" k% `
- });1 M' H7 E" S! v6 h
- // Listen for messages
& ^6 p5 t- n; [8 @7 B - socket.addEventListener('message', function (event) {
5 w, P* C8 v) ~! A ^* R/ k - //接收服务器返回信息, p% ]# Z8 ]. F( O4 H- B/ ]
- console.log('Message from server ', event.data);3 [3 m) d" j5 ]8 q( q' l# O& ^# _
- });1 j! Y* c: p7 b0 @: e
- A) u' Q. z% F2 P$ L3 h
复制代码 伪直播主播页面
- c+ B/ p9 W# Uhtml - <body>6 N$ K+ ?$ P3 S9 j( P
- <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>2 P3 v+ W7 {8 ~4 x' W
- <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">( i/ ^, n1 S; l/ ~' i5 @! s: S) p5 U
- 画布
5 N2 R( P) i& | - </canvas>
1 I7 Z0 `( u5 y( K7 j2 o; F* \ - <img src="" id="videoImage" width="350" height="700">
- h. X, ]! g$ {+ k - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
0 w$ p- a0 d. V# I# }' v4 u - <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>6 C. ]1 T; S0 t
- </body>
2 y% N$ p8 v' a) m
复制代码javascript - var v = document.getElementById("myVideo");
. w& z9 l! w" d `+ x - var c = document.getElementById("myCanvas");5 G+ Q, {9 c: D
- // var c = document.createElement("canvas");" q5 X; H( Z% T2 u" O
- var img = document.getElementById("videoImage");
/ s, b! a( i9 K0 M - ctx = c.getContext('2d');1 `, k1 e9 `( ]" u4 D9 {$ |, `
- var dataUrl;
, w3 D8 Y* I8 j! r- I* \ \ - const socket = new WebSocket('ws://xxxx.com:9502');3 R/ i& h; C7 v7 T/ j0 S5 B
- //Connection opened
1 y- O! c- z* c! x - socket.addEventListener('open', function (event) {
6 @! t$ L! d- y6 H6 j$ W) i - // socket.send('Hello Server! im websockt');3 U! R1 x1 _: e( l0 G4 D g
- });) P7 y# _- F& x9 m7 p2 e' p
- // Listen for messages
/ }! W0 H( B8 ~$ w( [; f2 \: R - socket.addEventListener('message', function (event) {' O- ]/ P4 c/ R, j2 K0 ` F
- console.log('Message from server ', event.data);5 S3 s0 q, H4 t3 L& F! w
- img.src = event.data;
" {' b0 h* D* h( Y+ M% | - });' z3 }2 O9 A) q7 ]
0 }! a6 R" E! T) T6 h* t+ i- function playVideo() {0 A# r6 t0 S8 } t+ m
- ctx.drawImage(v, 0, 0, 350, 700);
# L0 i2 l- {; x2 V; |* W+ e - dataUrl = c.toDataURL("image/png");
* \: G+ V) n3 U8 R, S - // img.src = dataUrl;; J3 t( d6 w$ X4 w/ n9 D5 i( m
- socket.send(dataUrl);, E) s8 W1 ~1 o% V1 h! E" v; w/ }
- }
, z. i: r4 r5 v4 w1 s6 F" c0 F - var tick;
: e# l s2 K) C1 L - function aphla() {, o9 e5 S: T% L$ _
- tick = setInterval(function () {5 L9 f) l* r) C0 n0 b
- playVideo();
) g' b' ^* k: ^+ \0 i - }, 1);4 v" x2 k; T; d, J) J
- }
D. T$ i9 {3 r( @3 I" ]2 P - function vdStop() {
8 q' G6 t% u: x0 W( k1 J- x& O+ V - clearInterval(tick);' c6 v) z3 Y5 S" ?
- }5 \2 ]$ I. a4 N
复制代码 用户页面6 L4 x D& Y0 H x6 v- ^; [+ X
html - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg"); Z! j* h' P" z5 N
- const socket = new WebSocket("ws://lm.com:9502");
2 e! R' ? G( B8 a; X/ ~3 h - //
; _2 h3 m* {3 U0 E, ~/ L* O; G8 N - socket.addEventListener('open',function(){- r: A. Q6 I/ ?! V8 T3 F5 ^
- socket.send('Hello Server! Im live.html');7 B$ z4 @' [ f
- });& Q. e( v7 A! H- V8 |( l' T$ @: e+ X
- // Listen for messages1 o( ^, K; a4 I0 T6 e7 E5 D n" {
- socket.addEventListener('message', function (event) {( U+ }! J' G0 Y6 @" q1 C
- //图片地址
2 k$ Q- u/ y* \7 R4 B5 P - img.src = event.data;
4 u+ X4 W( M$ j, i9 L( |% G# D - });4 r& U, C# t* {3 E" ^8 s, b/ C* h+ O! o
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法 4 m( y/ S o( @( j5 B
0 T# r7 q) A G( [ |
|