管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器5 C' `! G# A' U/ L G
- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1); $ ~5 w; K8 i1 u) \0 }" a
- //创建socket服务6 u, ]$ ^/ n9 Q0 d- N- F8 k
- $ws = new swoole_websocket_server("0.0.0.0", 9502);
: X/ q) k& i7 _7 z) T$ c - //监听WebSocket连接打开事件
0 j3 Y/ [( B% `. G. b- E - $ws->on('open', function ($ws, $request) {0 |& }5 ]' F0 k$ B! y) R
- var_dump($request->fd, $request->get, $request->server);
" s0 ]3 `0 {6 p' _9 |+ b$ P - $ws->push($request->fd, "hello, welcome\n");8 W0 C$ U9 w I
- });
3 h [) W7 K% S7 e* s `4 Q - ) ?0 N+ o+ S9 V x: R
- //监听WebSocket消息事件, W0 z1 M# p. a3 \- P+ |8 c
- $ws->on('message', function ($ws, $frame) {; g% G& S6 B4 g; U B k
- //推送消息给所有用户 e0 K4 z0 a! U: n4 o, K1 o
- foreach($ws->connections as $fd){' N8 x6 p/ y" { {+ }# \
- $ws->push($fd, $frame->data);
# I i5 e2 {( z- G - }
; ]3 H( Q# b" M1 y6 r2 H - });& Y g" s: R4 |: D Q
( l0 J( t3 H9 z2 P( N- //监听WebSocket连接关闭事件
* A5 r* ]- a- ?$ u - $ws->on('close', function ($ws, $fd) {# U# {, a5 T9 y. M, F. ^
- echo "client-{$fd} is closed\n";
1 \$ D6 f: p# e8 q - });
& g# q- l' n) Z# n: ^ - //启动服务: j0 d% ~& C- J9 u4 {, C$ ?3 M% \
- $ws->start();9 a+ u( z6 U$ U$ L
" w) w( Q, k$ d, ]+ t; Q
复制代码 7 b* m: e8 I# u# b0 L: m
Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端
0 Q. I- F1 }- {' w, @代码如下 - //连接服务器
n1 E& i$ e: S$ C# V" I - const socket = new WebSocket('ws://lm.com:9502');
5 R' q- f# [6 {, O$ z3 B: o3 [3 } - //Connection opened9 `3 |: L1 i: J: M9 ~# w7 N
- socket.addEventListener('open', function (event) {3 H! ]! c$ _2 U4 G$ ?2 R
- //发送消息给服务器
& m/ I. C" L9 S0 h( A$ y - socket.send('Hello Server! im websockt');
4 N$ {9 _& U0 B( O - });
7 X" r- {6 ~6 s& Y% t+ F4 m l# J - // Listen for messages
+ @9 f- |1 C* y# v/ h, g" {2 ?; d - socket.addEventListener('message', function (event) {4 j' x1 S! d- W1 r9 Q7 j: ~
- //接收服务器返回信息5 F' G6 r% e2 E8 H4 \
- console.log('Message from server ', event.data);
! {' X$ U3 D6 ]3 Y8 ~: A - });
- K- t. q( K1 b) X) R) l: m8 ? - . s2 `, H+ P; |
复制代码 伪直播主播页面: P0 `8 o, s( D& g5 b' `+ B
html - <body>( F. G/ g. s i+ O" o: Y
- <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
7 C" s1 ~3 u) d' [! u7 s - <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">6 X6 \: K* n1 _! g
- 画布& M0 [0 o0 ~6 U4 | b) O+ `
- </canvas>7 ~' I; B R5 O
- <img src="" id="videoImage" width="350" height="700">
8 R$ x" c5 Q$ ]; z - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
( s% @ O! r1 n0 |6 D e5 ?: e0 t - <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>/ S: v" H5 W! y% q
- </body>
- x+ r' p* z- U% m: T' F# G/ J
复制代码javascript - var v = document.getElementById("myVideo");
& E$ q% M0 Y* d7 c5 k - var c = document.getElementById("myCanvas");
: w& K2 J3 h. s2 g* w c, T - // var c = document.createElement("canvas");1 q& h: J% p- x
- var img = document.getElementById("videoImage");* A- |/ r1 A9 }5 {4 W3 h
- ctx = c.getContext('2d');
) _/ U- {4 D) F - var dataUrl;
) V: |% S# P4 Z/ I - const socket = new WebSocket('ws://xxxx.com:9502');; A" O) {7 _7 Y, n* L1 p
- //Connection opened" k d1 r5 W9 D, b' N. y# e' g
- socket.addEventListener('open', function (event) {% L( o% _! K& P4 E# E
- // socket.send('Hello Server! im websockt');
' Y5 ~5 M! J9 k3 g' C - });
3 x2 y: J+ ~$ F! b0 _& G6 l - // Listen for messages
4 b( U* b' C: o, ? - socket.addEventListener('message', function (event) {
. K; |; Z* o* A) ?$ q - console.log('Message from server ', event.data);
+ P1 i5 ~1 ^0 H9 v - img.src = event.data;
/ _$ Y1 u9 Z2 v! E7 m% L" ~ - });
' c) j% Z( f# }* Q
5 {3 _3 e' u2 S# Y, [. v8 A- function playVideo() {
0 U3 M* z6 A3 S) J$ `9 @. D: ] - ctx.drawImage(v, 0, 0, 350, 700);/ a. Z. v2 f \3 _" s* g8 H
- dataUrl = c.toDataURL("image/png");
3 w* | f2 A2 q/ B( q, P - // img.src = dataUrl;
" L. c$ o/ v, }8 n R - socket.send(dataUrl); S4 m) \7 ]6 `# J# G' _: y
- }( g% q- w4 e' t; A
- var tick;& N1 a1 D- y4 L! n; I
- function aphla() {: F( _# d1 _" O
- tick = setInterval(function () {2 S. c: }$ b: k8 i( r6 H
- playVideo();
# F' E5 [5 K: g - }, 1);- B5 y* A# b$ O! ]9 A
- }
?' {# z/ I/ r- X, A- y7 h( L - function vdStop() {! O* K+ P; g5 g4 @
- clearInterval(tick);5 { g, j6 O0 M, g; K
- }
. j7 S( c! J' {9 h% }% C$ Z* F
复制代码 用户页面, D/ s- m' M1 K
html - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");
$ `* O) d, x4 \4 ?1 K1 { {( f - const socket = new WebSocket("ws://lm.com:9502");$ h6 r! k- a0 J6 @4 |4 H/ s
- //8 n+ v4 v: g# ?
- socket.addEventListener('open',function(){
, g- o! [& `6 A6 i - socket.send('Hello Server! Im live.html');3 J! `6 o% g' r c4 ~
- });
0 }( b" Y: B& I6 w! }- e - // Listen for messages
3 j; |7 @; Y" x' Z6 _: M; B - socket.addEventListener('message', function (event) {% W% g9 D& R6 Y# I8 R% {
- //图片地址* I% w8 n3 a2 q1 S; d
- img.src = event.data;* m$ E. U9 {3 O6 ~! b- B' i1 ~
- });2 b8 w+ f2 I; I: g
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法 ; f& B& @- G5 }/ U% x8 s# F
0 I( k5 g" d& A5 C u b- Y |
|