管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器! t# v; S: B; f5 [9 E }
- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1);
( p6 K$ ]4 U, u( s2 |/ u - //创建socket服务$ A# _; n+ ?1 r& E) X
- $ws = new swoole_websocket_server("0.0.0.0", 9502);
1 V+ o X/ Q5 b" R3 |- t - //监听WebSocket连接打开事件, V0 {/ ?# @; O$ L7 U r' d' B: a
- $ws->on('open', function ($ws, $request) {( @; T# u; H( M; J
- var_dump($request->fd, $request->get, $request->server);
4 t. G$ J I% a- r5 q - $ws->push($request->fd, "hello, welcome\n");0 r2 ]: R1 B- |6 E. j% m2 }$ ?+ F
- });
) G$ `* ]( v# Q4 ~6 S, i - - A4 i7 N& ~5 `7 D
- //监听WebSocket消息事件
8 y$ N' B9 {& Y1 }( } - $ws->on('message', function ($ws, $frame) {
2 _- C9 [: \- L( N& S7 J9 m+ E - //推送消息给所有用户
# C( N: P# ^6 f L( x5 ] - foreach($ws->connections as $fd){
( ^6 {1 N, e% {$ X1 j! T: m9 ? - $ws->push($fd, $frame->data);
: Y" V, |' k% s5 |* g - }$ f+ i2 f$ p9 w( s$ v, y
- });+ H& h0 Y) x; L8 e3 b+ x
- ) R" y, L. H! R' r/ i
- //监听WebSocket连接关闭事件! H$ B2 U# @: m) m
- $ws->on('close', function ($ws, $fd) {
Y' I* w+ w( I' u8 r8 R9 \ - echo "client-{$fd} is closed\n";" i. }9 c7 Z U% n: Y7 a
- });/ H j' w0 p1 C! D3 H: D1 @
- //启动服务( d+ p; c# V9 o/ z" P3 A$ ?, C
- $ws->start();
/ s$ Q( C9 q# ~" i9 \ - 8 b9 `3 Q% t s
复制代码
7 _6 M- G* k3 h3 o; ^4 q3 {Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端
6 A1 ~* ^. x z# e1 s' g代码如下 - //连接服务器) ~/ w1 A/ z g* ?! E9 L6 ?
- const socket = new WebSocket('ws://lm.com:9502');3 ]8 u5 W1 d" b
- //Connection opened8 {% w9 M. a* `7 D. O! u9 t4 D
- socket.addEventListener('open', function (event) { z+ x$ _5 s% w3 a5 N7 D) @
- //发送消息给服务器
' X, H. V+ H! R' d) h - socket.send('Hello Server! im websockt');
- p. G) O* s4 d1 g5 ^& s* r - });8 f' Y" _0 e4 v x
- // Listen for messages: Y* Z& Z# M8 L& z l; V5 G/ m
- socket.addEventListener('message', function (event) {) t( e* h# N. A/ \! ~8 V: K( B
- //接收服务器返回信息+ A3 b% \3 j& q1 E1 |9 k
- console.log('Message from server ', event.data);
% L% v; q, W$ O: ~ - });) z' G; Z' ^/ A9 ^6 ~, `
$ e2 { L* P$ B
复制代码 伪直播主播页面
) D$ x' c$ ]& n8 y2 v( r9 ^- E3 t1 `html - <body>
& X% {$ h' x- v# c8 x, ~) O - <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>% C' B7 A/ \( p, n6 T/ @+ ^
- <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">2 [9 a# ~# ? q5 y3 a
- 画布, B3 i& o; ^& g
- </canvas>( I: m' e- E6 ?* W6 K
- <img src="" id="videoImage" width="350" height="700">
6 G o& A8 W6 O2 o - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
! g- W7 a0 b$ c! B/ o - <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>& g4 t& m" Z, S9 j$ s
- </body>
0 r$ S7 ~4 [' y. y
复制代码javascript - var v = document.getElementById("myVideo");. D* g: z8 w8 J9 R: U- V/ j- V
- var c = document.getElementById("myCanvas");
8 t6 ~0 F$ `; C8 p, Y3 J - // var c = document.createElement("canvas");. _( A% M# J: @4 f' r' G
- var img = document.getElementById("videoImage");! q! D( ~5 {$ I. N% w
- ctx = c.getContext('2d');$ C8 W9 d Z$ W- |& W: L
- var dataUrl;
7 o' Y+ P$ `4 f9 z. Y - const socket = new WebSocket('ws://xxxx.com:9502');
. b5 ]9 ~) q q - //Connection opened" N6 a& B* e5 M
- socket.addEventListener('open', function (event) {& {2 F5 p- \ d3 o# P: l _
- // socket.send('Hello Server! im websockt');
0 g' `! _* O! s& y - });/ A( o* e) p- A: p, K1 ]4 m
- // Listen for messages2 I) O* N( p" h- P
- socket.addEventListener('message', function (event) {
0 B1 i! a: G' _) {+ `3 g - console.log('Message from server ', event.data);
; m0 O8 {! x4 J' r7 T$ e% W - img.src = event.data;
6 p/ {2 x( R# |4 m. p - });( E7 z5 P1 P8 `7 g; x0 T* S) s
* j9 l" m- G) f9 G3 a- function playVideo() {; j' ^/ W' Y0 h
- ctx.drawImage(v, 0, 0, 350, 700);
9 Z0 {+ W- U. I: v% l2 U - dataUrl = c.toDataURL("image/png");7 Y/ ~. S- {& f6 m E9 o! m* E2 Q; L
- // img.src = dataUrl;7 e4 C7 q8 Z3 _( ^0 ?/ L
- socket.send(dataUrl);
$ d# {2 Y5 E( Q6 Y/ T( E! I - }
% A! ]( Y/ Q8 K - var tick;6 F8 z( Z" c) \
- function aphla() {& d% R1 F* u; P" \& J
- tick = setInterval(function () {
% y& A1 o& o6 V8 d' \6 P - playVideo();
& U# l7 J v4 g1 h - }, 1);1 M U e2 i" C0 M4 S, i: @
- }
1 o9 `% d6 ^- j" J) } - function vdStop() {
" g4 a2 y& Q% i: M% O( ` - clearInterval(tick);, l+ w9 }* N/ F: q
- }' B5 Z# e6 n+ e( N
复制代码 用户页面
i" @$ r: S* Uhtml - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");
0 n' `+ B: o/ n0 y+ S, U7 M - const socket = new WebSocket("ws://lm.com:9502");. G( @7 }- S) ~
- //
$ a" l8 P% h/ g+ E& q5 ` - socket.addEventListener('open',function(){' E7 T1 g7 A: i' e
- socket.send('Hello Server! Im live.html'); O! h. z8 B1 p5 u* r
- });
3 e$ A- Y2 b* |( \# b2 k3 E - // Listen for messages
6 R. ~1 T' w# e/ }, { - socket.addEventListener('message', function (event) {
! Q9 S8 Z( S5 k. |' q - //图片地址4 x' N% K7 i0 k
- img.src = event.data;
' G. h3 J% n) o2 u - });, E% Z. i9 f9 _% H& d, _
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法
( i* S6 L' |1 C$ s- |; o6 h
* b. l! e9 g: o, b' O2 ?- C' L( s |
|