管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器, K4 n9 \9 l7 r: t
- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1); ; m9 U" H# k' n1 {5 `$ C' y" s5 `
- //创建socket服务3 Q* }; i/ q3 j7 o5 [* S
- $ws = new swoole_websocket_server("0.0.0.0", 9502);7 c5 b( a; K d: B* Z
- //监听WebSocket连接打开事件
; w3 H+ h) ?/ {( h9 l [ - $ws->on('open', function ($ws, $request) {3 J |5 g: R# a, d3 w+ z
- var_dump($request->fd, $request->get, $request->server);: Z7 B+ n0 {. J
- $ws->push($request->fd, "hello, welcome\n");
4 `4 ?- P1 O4 G - });: V' Q/ B; _6 ]# k) N
% h G q3 [, T! |+ q" [: b- //监听WebSocket消息事件2 V* C3 f! B- c: Q. ^
- $ws->on('message', function ($ws, $frame) {9 R' h0 x6 j* N& A; H
- //推送消息给所有用户7 D' ]+ W& [; j, q: \4 g2 G% w
- foreach($ws->connections as $fd){
5 V" ]3 F/ f0 I& G! J8 Q% Q9 p; C, _( V - $ws->push($fd, $frame->data);
8 h+ x0 l$ ]' W - }0 K# Z ]6 p3 ]
- });6 p. x% s8 P$ x' B
- : c) `6 G( c0 `$ j# F$ W
- //监听WebSocket连接关闭事件8 N9 w& Y( C9 X4 B
- $ws->on('close', function ($ws, $fd) {
T6 G1 |* e* t! R: q* j3 ] - echo "client-{$fd} is closed\n";
3 G% @ M7 F3 Z+ W5 B. V% o, F - });
0 ?$ [' A7 a% { - //启动服务
* P3 o% R4 s) G: z - $ws->start(); Z1 |3 A4 r' o8 D7 h& V
0 [; }0 k; m0 e& L
复制代码 1 @ L9 t0 b- ^/ t5 ^6 Y5 o
Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端
9 D3 U6 @* A4 D& b6 c- J& s8 z8 ~代码如下 - //连接服务器
8 i" O+ l8 M2 n% V - const socket = new WebSocket('ws://lm.com:9502');
" E7 D' m% y) @1 {$ Y4 R - //Connection opened
! D% c9 y( R0 g0 K u$ z' ?7 `4 ^ - socket.addEventListener('open', function (event) {; l4 j: y' I: f+ x0 ?
- //发送消息给服务器5 t8 B6 d( p& O0 y& B2 _, D
- socket.send('Hello Server! im websockt');& ?/ h1 U; \( Y& R# z
- });
4 r" Z% n- `) x: m7 n5 r - // Listen for messages; B* E# y0 I8 ?& p4 \: |0 A
- socket.addEventListener('message', function (event) {
6 F9 V1 D& Z1 i8 y, g - //接收服务器返回信息
- e" e: s8 ~7 i( }) J1 Z - console.log('Message from server ', event.data);
! Q! |! R8 T& k: U2 P9 @ - });
2 ^0 a7 M& w3 l8 u( z4 [" a; x- P9 S) Z
+ N0 b9 R) s3 G4 H4 [, @ y9 ?& Z
复制代码 伪直播主播页面
$ F# J' G# V* }4 R% d4 _html - <body>* i1 s( V" @# d1 I
- <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>2 v h* q( P' p% F' g
- <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">' v* s) H6 R1 y- d6 k( X8 W
- 画布
0 t" @4 Q" _% r6 Y- F$ K1 S - </canvas>- A* T$ |0 J$ k# r' T& m/ _3 j
- <img src="" id="videoImage" width="350" height="700">
7 }! y$ B3 r5 w) ~ X. H - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
" h; I: J4 h$ k. G$ L9 j4 u% q - <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
+ ~- z' w( G7 T! K/ Q" D8 q# } - </body>8 S! y- _/ z5 U+ B1 ]# O4 Q3 X
复制代码javascript - var v = document.getElementById("myVideo");
0 \% U7 A. s. N% o, | - var c = document.getElementById("myCanvas");
/ I8 y( L( Y) `6 j- \( D' y - // var c = document.createElement("canvas");: ^8 b( `( Y0 W/ c7 X
- var img = document.getElementById("videoImage");4 |5 R8 Q# s- ^) o
- ctx = c.getContext('2d');! w8 h. E6 R' V9 I# ^7 m/ n
- var dataUrl;
+ `1 [/ s8 S& `) v - const socket = new WebSocket('ws://xxxx.com:9502'); G" B. D, I4 C& W3 J- U
- //Connection opened
" x% e% K1 L0 Q - socket.addEventListener('open', function (event) {: p0 ?8 W) \5 x& h
- // socket.send('Hello Server! im websockt');3 X3 h; C0 q& p0 q" C
- });' D& m* o" o2 }
- // Listen for messages
. k1 S3 s7 }8 {' y - socket.addEventListener('message', function (event) {- O5 y' f& F2 m' D- b
- console.log('Message from server ', event.data);1 Z2 `0 \! _( X2 [. Z% a* s
- img.src = event.data;
7 F, N( N) j$ \* s. a! H - });9 d' I: |7 {8 {9 D1 ~8 o& P
( ?* |& e( G0 d: q& |* H }5 \! s- function playVideo() {
h$ p& _+ u: {6 X" h4 A - ctx.drawImage(v, 0, 0, 350, 700);
: E" }# i! d$ N, ^, m& f - dataUrl = c.toDataURL("image/png");
0 F! p- u% w9 @, {7 {) N* V/ q - // img.src = dataUrl;9 S5 p% s2 {0 H! _
- socket.send(dataUrl);
) H `4 x, t& a/ Z) Q9 G - }. R3 ` i& {% S( t* o
- var tick;
- s5 _1 V! ]) E o2 ` - function aphla() {
$ |8 ]+ W) H' s. |3 \+ j# {: g. } - tick = setInterval(function () {% b7 e4 l' \4 l% }
- playVideo();2 Y7 ]! B6 @ m0 ^' ?
- }, 1);1 G( }5 X# b3 \
- }
7 ]+ n3 n/ Q* G# z - function vdStop() {
, ^" M! Y" h' r+ x# i - clearInterval(tick);
5 ~8 G) @0 f0 n6 M; \. ^ - } {, p/ Y, @! m8 Z9 B- w
复制代码 用户页面3 k2 z2 _ C P8 W
html - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");4 b- A- y9 A8 ?8 B' o& T- f
- const socket = new WebSocket("ws://lm.com:9502");/ s( t. h7 Q# T
- //
/ ^( C$ ?# L" Z; @; i1 p* q9 e - socket.addEventListener('open',function(){3 {" ^) j) B: ?4 d1 a$ V$ X) X
- socket.send('Hello Server! Im live.html');
% d2 o U- B3 U. U' a$ y6 J - });$ ^8 l$ F: t* P
- // Listen for messages
1 P8 |3 P& M9 g" V0 } - socket.addEventListener('message', function (event) {
) n* F3 [/ J( z' q } - //图片地址' O. @5 B4 {+ |
- img.src = event.data;8 a& M% n; }, c
- });) K. O( z! o( u- |. H
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法 ' l: l7 Z, s9 z2 ]* Q) ^- e# D, K6 `0 h
! i- i6 j; @ Y4 f |
|