管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器, Q( o( P4 J% J+ G" V. ~
- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1);
, p$ x. \# c. E7 Y$ A7 G8 a - //创建socket服务+ L& y: u. L6 Y/ y4 o
- $ws = new swoole_websocket_server("0.0.0.0", 9502);
8 U$ D$ V+ A5 t4 ^& K2 Z* c) L - //监听WebSocket连接打开事件
6 }% l8 u" j5 y9 b* p- L& _ - $ws->on('open', function ($ws, $request) {
4 Q$ q; x0 J% f2 f8 S - var_dump($request->fd, $request->get, $request->server);
: O4 U7 X, L% L0 l - $ws->push($request->fd, "hello, welcome\n");' v5 B5 G/ ]8 ]! b
- });
" s) |, K. P- n& d( C
3 ~! Y9 y. b7 K$ K6 M- //监听WebSocket消息事件. H5 ^! J* d& G/ V/ u
- $ws->on('message', function ($ws, $frame) {2 C. e2 i" n8 ~1 R' @+ T- U# Q; X
- //推送消息给所有用户* q u8 g% Y" x* j- ~" U+ \& ^$ B Q. o
- foreach($ws->connections as $fd){; {. {* d8 `/ I$ v, F9 r
- $ws->push($fd, $frame->data);
6 r6 i6 H `2 F( J, U - }
7 v9 j& @" [ x$ x) c) k - });
9 g5 \4 a+ C' e% Z0 `4 c
, y+ O2 `% M" l5 b$ s$ h8 V. G0 f; ~- //监听WebSocket连接关闭事件
9 v$ s9 x, b& b/ m" n - $ws->on('close', function ($ws, $fd) {
* b" I3 ^8 r0 H L! r - echo "client-{$fd} is closed\n";, K7 a: T" O4 D; K3 B( N+ n: C* z
- });
* {1 [# ?6 `* [+ [' I1 R/ P5 I - //启动服务2 j8 ^3 T" b5 n; p+ ?/ N
- $ws->start();
" W R. [) P- F) n - + x8 b2 H0 O: U' a( ~1 O
复制代码 " m' q" ?8 ]" q! I- h. \
Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端
0 y0 L; a- C' h& E. y2 t代码如下 - //连接服务器' w% L. q- @5 C2 C7 f; U# t
- const socket = new WebSocket('ws://lm.com:9502');6 |- ~" H: q: k& t6 n# N3 X1 y1 p4 H
- //Connection opened/ o. f- j! c$ E& V9 S3 B
- socket.addEventListener('open', function (event) {! L; W' v; R$ j& Y6 S- P. x
- //发送消息给服务器3 Y) a/ a2 c% Z& ~" T
- socket.send('Hello Server! im websockt');9 D4 A% a* n3 b" V
- });1 L! ]2 V& J5 ]% m" n5 y0 f
- // Listen for messages
& C/ V- `2 b! r7 G6 t5 ~8 s - socket.addEventListener('message', function (event) {: u' B$ o$ C* l& c! @& p: i
- //接收服务器返回信息, H# T' T" K! [6 D3 E1 B
- console.log('Message from server ', event.data);
- ]9 l3 A" ]" E% j9 j - });" g2 _8 ]+ U. I3 X
- ' Y- j, ^. }5 K6 ?. Z
复制代码 伪直播主播页面
! [" _7 u* _; N( U1 Phtml - <body>! m- m* ^* m5 n& F: z, }
- <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>6 p# a6 V% b5 E% b4 _
- <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
u1 a% {( o r- P/ h$ ?/ U - 画布3 d) o9 {! k% N/ C
- </canvas>
7 o3 P7 ~) d( V; {. | - <img src="" id="videoImage" width="350" height="700">
& y$ M) v1 n8 e( ] - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
! {$ d6 ]) Q& C - <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>$ A3 S" R+ W w7 I% i
- </body>
# N+ ^9 s+ m# |7 A6 c/ E) ~* q6 ~
复制代码javascript - var v = document.getElementById("myVideo");( z9 H) q: ?1 u7 n" @1 h3 ~' ~
- var c = document.getElementById("myCanvas");
4 X: ?- P4 ?+ [ - // var c = document.createElement("canvas");1 y" |( X; g, L* c' X6 Q
- var img = document.getElementById("videoImage");
" }+ I; j8 c; ?" W6 V; C% N - ctx = c.getContext('2d');; F" Z; \2 @8 p9 X! v! P
- var dataUrl;7 G1 ^6 G- [! O# d( c% L
- const socket = new WebSocket('ws://xxxx.com:9502');
# u6 X. c; ~+ ^$ z$ W - //Connection opened
1 N" ]* U! g9 P! T: d - socket.addEventListener('open', function (event) {. n' S) o$ N8 B. Q L4 d5 t
- // socket.send('Hello Server! im websockt');7 b: M- w6 h' f; u& ^. s
- });6 D! V6 J$ ?0 u5 I- h& I
- // Listen for messages
; t1 {2 c* h; j( I3 ~% k - socket.addEventListener('message', function (event) {
8 b I5 {3 ^- t4 n( i* ~ - console.log('Message from server ', event.data);# w) C7 y# w! K1 u. h5 }
- img.src = event.data;, `+ ^9 v/ m7 i
- });
4 L0 o' J$ q& z* b' x
7 D. R# v7 a3 F8 B3 D- function playVideo() {& P) r/ d) M$ }) S
- ctx.drawImage(v, 0, 0, 350, 700);
' @ F$ F) D1 `' @3 z L - dataUrl = c.toDataURL("image/png");- o6 t0 y- Q7 c% P( j, \( g! N* J
- // img.src = dataUrl;
5 X4 [6 d; m: ^& @9 H4 x& M: L - socket.send(dataUrl);9 t- Q+ M3 _/ m
- }
, ~( X* Q0 L, M+ {( ]; u7 e - var tick;
+ Y( f! q4 Q( M! D/ c( | - function aphla() {
; N# \5 a2 { @$ R - tick = setInterval(function () {
# B1 W6 f# I7 @0 i* p9 ` - playVideo();- v/ V7 ]; d1 ^3 a
- }, 1);& U# T! j" J! F
- }
* ]' v5 Q+ U" R: u! t - function vdStop() {0 t5 b( j" G/ x; Q
- clearInterval(tick);
1 R/ k8 n/ ^5 D3 h - }8 a( p3 P! ]4 o( m1 {$ J
复制代码 用户页面# T% f) B6 ?, q6 `/ `' s) p
html - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");
; r4 ]+ F. Q9 H/ g0 t( e A7 O- { - const socket = new WebSocket("ws://lm.com:9502");
* A3 X" \0 ^# ~' C - //
6 E' k: ~# H( I/ D7 { - socket.addEventListener('open',function(){
) |, y7 I% S. X - socket.send('Hello Server! Im live.html');
% y/ Z | b4 y3 O: D2 ` - });
; z' V7 ~9 M) \. u# \3 w - // Listen for messages6 f3 Z9 E% m' Q# \; E
- socket.addEventListener('message', function (event) {
! C0 @1 t% |1 q/ Y( F, z - //图片地址0 l* j v8 D+ _! u4 Q7 E7 S
- img.src = event.data;
4 i: |! e1 k) J9 F+ l4 T - });9 Z. t8 G& O$ U" y3 G% _
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法 / T$ j! p' q( j8 z$ j6 q
: a- |7 ~6 J4 b, E |
|