管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器; m; {1 ~7 f8 }2 b
- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1);
! l. Z" R. A9 p8 ?( ^ - //创建socket服务
: S0 Q/ J& C7 F! N( Q/ W8 m$ G - $ws = new swoole_websocket_server("0.0.0.0", 9502);5 A! k- H* a/ d4 M7 D, {' P
- //监听WebSocket连接打开事件/ W) a A# `! i7 b; |
- $ws->on('open', function ($ws, $request) {
' i/ |# ~( o, U) O- [2 Q - var_dump($request->fd, $request->get, $request->server);# s& e& a* V u4 _ `
- $ws->push($request->fd, "hello, welcome\n");2 \& ~2 Z5 {) s
- });
( c- I" P! c* J7 W9 V2 f - / L1 A7 A3 [6 [$ h/ }" x6 V
- //监听WebSocket消息事件5 K5 S# b* Q( J4 l: N
- $ws->on('message', function ($ws, $frame) {% m/ j9 u7 j( a e
- //推送消息给所有用户
4 s0 O7 p& s5 Y' V2 X" ] - foreach($ws->connections as $fd){
1 q1 J+ A; L/ w! T - $ws->push($fd, $frame->data);7 h: U; G# g& [
- }
/ D2 k+ B4 T% R1 N0 O3 k8 ^ - });
5 [; a8 Z, ?6 B! B' Y2 l9 _ - % p' j& u- D2 @4 L) v t% Z
- //监听WebSocket连接关闭事件
+ c. }( h' \, N7 {, t6 m I) C - $ws->on('close', function ($ws, $fd) {- }" Z' j3 w) r" K% P; ]4 ~- m
- echo "client-{$fd} is closed\n";
& W; ]; C5 } e8 H" B g+ n4 D# ]2 _+ F - });& I3 _' X" V. H& L7 K4 C
- //启动服务- H4 ?0 X# ~+ u. D. |, F, W
- $ws->start();, |4 T1 W; o. U) f$ {* V
- # S3 ]2 |2 |) `" U% x$ \
复制代码 . Z: w# v! J3 T0 j5 [
Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端2 e/ |+ x# u0 ~$ Y' d5 N9 }
代码如下 - //连接服务器
8 v1 C- u' R8 B; b3 h# g% F. J5 y - const socket = new WebSocket('ws://lm.com:9502');
7 r, Q Y7 a' a$ H( _ - //Connection opened/ r5 G8 f& [! O- [! S
- socket.addEventListener('open', function (event) {
$ I6 F/ P' e( K2 t6 i$ s - //发送消息给服务器
& v+ i6 q# g. g4 i3 \" } - socket.send('Hello Server! im websockt');
F/ c' ]* s T1 L; m, G - });
7 ~, E- g/ }5 S2 x1 W2 r- j - // Listen for messages8 }- I$ P) y2 c. s2 B) y5 ^
- socket.addEventListener('message', function (event) {2 O( f0 b I$ V* u
- //接收服务器返回信息
. \: l1 A: R, } O. h - console.log('Message from server ', event.data);
% i7 X* e2 I4 I1 I. i1 \ - });
, y X( E# w% i! `3 F - 8 ~8 y9 j1 M' J6 c, c! Q1 t
复制代码 伪直播主播页面6 ?5 p' i& B! z
html - <body>9 y( L% J1 L& m
- <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
- j. }% P* W" N8 J5 @ - <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">: R5 V3 A" A9 W8 s2 f3 t
- 画布
' ^2 [! x( C( V9 B; B - </canvas>( g2 H) m$ `$ l% b2 R
- <img src="" id="videoImage" width="350" height="700">
b" b2 Y5 J: g( ? - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>4 e- \7 m2 ~$ [+ `! D, M
- <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
3 |% f$ x7 E# w/ ]. `8 h2 [ - </body>
6 l3 b: i& U/ P: I* U
复制代码javascript - var v = document.getElementById("myVideo");
- v& z. N( c. r. Q! d F2 i" ] - var c = document.getElementById("myCanvas");" Y$ _) s( N4 L' c4 {" K
- // var c = document.createElement("canvas");
; C) t: V* f7 Y# t, E - var img = document.getElementById("videoImage");1 w5 q; }* t- J( Z
- ctx = c.getContext('2d');! s' _4 o! z% s* w: K# u( @
- var dataUrl;! P* ]" o9 D, Z6 C' x, G
- const socket = new WebSocket('ws://xxxx.com:9502');+ _, s: Z' t( r( H' e) ?
- //Connection opened
) @5 e8 R' Y: i' S) b - socket.addEventListener('open', function (event) {: G6 p( ?, X& }1 ^
- // socket.send('Hello Server! im websockt');" o1 s0 U( V7 p. R o. B
- });
6 y6 d7 o' \4 Q3 B - // Listen for messages
5 {. L# b- @' P! Q - socket.addEventListener('message', function (event) {& S6 U( h( I: z' z+ N, Q
- console.log('Message from server ', event.data);
' ]0 z; w6 B: I% V) v9 S - img.src = event.data;
% Y2 s; V! Q4 R5 m9 E! y% t l - });
. x2 ` R7 K7 P, y9 r# Z
9 T0 c. ]. d& m U A8 [7 O- function playVideo() {
) w2 L, Q3 x# A P3 D } - ctx.drawImage(v, 0, 0, 350, 700);9 T3 W9 K: p' ~, l# | P9 N0 S
- dataUrl = c.toDataURL("image/png");
, e) S% M- n" {5 G# M9 Z1 t - // img.src = dataUrl;
! G: d6 G% u6 j9 ?" s6 u+ x6 Q - socket.send(dataUrl);; G# w$ K4 }0 T E5 p
- }
, p/ Z; M' k! S- `- s c. @$ [ - var tick;0 A( X8 Q2 v, }5 i
- function aphla() {
( H6 r" F b& A# d* F - tick = setInterval(function () {
^5 J. S4 [: s; Y+ I J - playVideo();" ]7 j. [+ D2 s! u
- }, 1);; E* e4 _3 z# ~
- }, r6 v6 v) o, R. R
- function vdStop() {
: d, A$ M ^' t! I! v4 J - clearInterval(tick);$ z1 X7 x5 T: A% D7 E I; c
- }
( o( V0 D4 O( j& M7 w/ J4 w. _
复制代码 用户页面0 P" p" K& Q9 ?' F9 g% p9 m- \( t
html - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");7 L/ n2 `7 ^9 N6 u( E( b8 c+ R* @
- const socket = new WebSocket("ws://lm.com:9502");
8 f' X" l7 X) g* b) p2 s! C - //) W1 }/ B3 y# p3 V) w. h) x
- socket.addEventListener('open',function(){
9 ~' R! N* n, _1 J# K - socket.send('Hello Server! Im live.html');0 |4 [8 Y" c- R. [0 q
- });
+ `! U$ P* [$ D3 i# k$ ~+ E5 Z - // Listen for messages
' I, G) u/ b8 \, e' P* }' b$ K - socket.addEventListener('message', function (event) {6 o2 H: V% w. m' b
- //图片地址, [* B" _0 R# _6 R s# |0 ^
- img.src = event.data;% O3 n0 y- i7 `- B3 s. h6 k
- });* {$ Z- b! c& H
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法
" `, U2 l2 f! K1 k0 d$ F
* L2 t7 G% K$ b* k; A4 ~ |
|