管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器
0 M: a, A' v1 L& Y- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1);
f* b+ A2 l: o8 _4 _; j: a M - //创建socket服务* _9 b; @1 ~9 T ?
- $ws = new swoole_websocket_server("0.0.0.0", 9502);' q& m& K) Y7 Z0 C% V4 B
- //监听WebSocket连接打开事件5 Q' u6 O) M9 y0 W
- $ws->on('open', function ($ws, $request) {
: }7 Z3 }1 _" t% l* K# j D - var_dump($request->fd, $request->get, $request->server);) x( q( A6 ]- r2 Y8 I% n
- $ws->push($request->fd, "hello, welcome\n");# {& @5 G/ @& X
- });* @# n0 M5 D* E( q/ ?
- 8 @5 R: `* e2 J2 n3 P: n
- //监听WebSocket消息事件
4 b& R( I4 ]) u* E7 q; O - $ws->on('message', function ($ws, $frame) {" L) i, ]7 W6 s' M
- //推送消息给所有用户/ o# ]- ?" o$ Y. @
- foreach($ws->connections as $fd){4 H" r: D" y7 Z
- $ws->push($fd, $frame->data);
, L7 s- L4 r0 l2 r5 e; F/ w3 J - }
5 s- H) D+ M2 i$ _2 Z - });) Y: _8 H8 y& K( }" z# H5 y+ v
- 1 ^7 q* G$ c' a# a
- //监听WebSocket连接关闭事件
/ Q$ L6 p, {2 c! S( D7 ~* F, E - $ws->on('close', function ($ws, $fd) {. O1 t [' Y8 g9 g6 T3 u' J9 e
- echo "client-{$fd} is closed\n";4 F* F. D( T% E- E! E
- });
( h2 u" l* A7 x( ` @/ |/ v6 N - //启动服务' {4 \' G3 p- T" Y. n2 n
- $ws->start();
9 r6 s3 _+ I" U% z; I5 C6 n y - / {5 M5 R* A0 V1 ^/ ^; l
复制代码 9 w" l3 O6 f4 `5 e; r( W
Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端3 x' z) y# ?8 v
代码如下 - //连接服务器2 D3 V. l' [8 x4 f
- const socket = new WebSocket('ws://lm.com:9502');
, r9 \7 I' N2 g; p0 |/ J! _* I ] - //Connection opened
+ x3 ?5 ]1 B; j" S4 m - socket.addEventListener('open', function (event) {9 o c; K7 N/ t% n( M
- //发送消息给服务器
1 m7 ~, I5 i; g* Z - socket.send('Hello Server! im websockt');8 G# Q: P% A' J' `# p
- });( j; N: U a; ?9 e8 ]# U/ D
- // Listen for messages5 F5 x- n& a6 n4 }
- socket.addEventListener('message', function (event) {$ y. f/ {! l& S9 w, ?% s( S) u
- //接收服务器返回信息
2 V# a6 F" E3 K6 T9 s. r ` - console.log('Message from server ', event.data);* L- H3 [4 |3 t3 ]# `& b% l' Y- T
- });* I' I# Q) C2 Z a) ^) a
5 H( i6 b" f/ h- n- o- G
复制代码 伪直播主播页面 f- \ b7 i9 N1 \: Y0 v" |4 [/ i
html - <body>
, Y2 u9 e. t0 U/ H - <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
+ A. D0 V C+ Y3 ]. w6 a& E8 |: w - <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;"># @) o8 v- B- ?5 ?+ B: t
- 画布
3 t" c' m9 F6 f- _ t* h - </canvas>
4 x6 P' m! e3 w& D D - <img src="" id="videoImage" width="350" height="700">
" a1 s0 V2 }3 ~. _3 [ - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
C' k2 G( x: }( r# A! n# @ - <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>1 @1 H" o+ @& r" W: T4 c
- </body>% p/ C7 V4 ]! a! o
复制代码javascript - var v = document.getElementById("myVideo");
8 U4 }- Q* e& |: M" D+ ?% Q- L5 v - var c = document.getElementById("myCanvas");# `" ~/ r+ `' [+ t6 n* ^
- // var c = document.createElement("canvas");1 x$ K( _' N( R) l( |5 G
- var img = document.getElementById("videoImage");
7 E' h0 R9 i4 L, Y - ctx = c.getContext('2d');1 m, T# a; i! N& ^
- var dataUrl;0 ^$ U) H# I" c! F3 v. L B
- const socket = new WebSocket('ws://xxxx.com:9502');
: l& c! Z* U2 ]" ?2 u8 z- e - //Connection opened& i. P4 y% z9 h6 ~$ N" Z
- socket.addEventListener('open', function (event) {( v% u F+ ^: l9 @6 a
- // socket.send('Hello Server! im websockt');
8 B# T0 j# V' [* A! j - });
: y7 ]2 J% E+ T5 Z }# \ - // Listen for messages, I3 G; f' K) n4 F
- socket.addEventListener('message', function (event) {* g5 G+ D. m7 F4 I1 I
- console.log('Message from server ', event.data);# I% X$ h) {$ m4 m8 g
- img.src = event.data;
v3 O4 _2 n5 q! b6 w - });3 W& R* }3 P4 |6 T" `6 T# v
- ' B7 l& ~$ v, i0 \0 y5 E/ v) q
- function playVideo() {4 N1 B# ~, b; ^$ ^# I
- ctx.drawImage(v, 0, 0, 350, 700);
! Z) }3 U, U4 z# B& T9 [ - dataUrl = c.toDataURL("image/png"); j& E+ ]* a* i& _/ O! i) g
- // img.src = dataUrl;
! x: Q' l1 L9 {: F: e) U2 b - socket.send(dataUrl);# l! k( W( I7 b! I# ?
- }% H4 i2 Y6 m& m/ ?0 `% w' c- o
- var tick;
4 E- o/ z6 z; d# A - function aphla() {
6 S3 {, x0 A2 F1 } y, U5 Y - tick = setInterval(function () {
$ Z% ^2 o6 S8 W+ x1 Q i - playVideo();4 b/ P4 O4 [% Z6 E3 _5 r
- }, 1);; j& q8 {5 i7 f* F. Z1 w9 ^
- }
" |7 U. n; _1 w( s& C6 C - function vdStop() {; `7 g% h% f7 ?+ @! P8 p
- clearInterval(tick);
6 K5 S! O; z! t6 \% R - }
* ?5 P) q4 K) n0 @
复制代码 用户页面
8 T/ b# S. D Dhtml - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");
- [! H! X% S5 s2 U; N - const socket = new WebSocket("ws://lm.com:9502");* h! n2 e0 H% C3 ~1 I
- //4 v; \2 k# T( U% d3 u' b
- socket.addEventListener('open',function(){1 B9 X' {- T% X8 u, O& M" D$ U
- socket.send('Hello Server! Im live.html');: |: i" a. S: X; K& `3 r7 ?$ U
- });
& F# _. A( t$ f# y7 e7 d9 n" J - // Listen for messages4 _6 X! s3 b& ?- |4 D0 A' d1 L5 o
- socket.addEventListener('message', function (event) {
& y2 N! j1 C4 h3 |7 P - //图片地址
, T- ]: z( Q' {" C - img.src = event.data;
/ W+ u! L H, X4 o3 r) s - });! e, z- g" g ~9 o! m$ x. s- F
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法 ) U0 r) T+ F5 Z- N/ i- y
7 W; B$ C7 H n6 s8 l; a$ w/ ~
|
|