管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器
( D C7 E; A. \+ G9 j" x- i- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1);
$ l+ g' o7 g4 i2 c - //创建socket服务. P! T" h8 R* [6 y: |
- $ws = new swoole_websocket_server("0.0.0.0", 9502);0 l; N3 p: h6 e- `$ w+ F
- //监听WebSocket连接打开事件
8 s& S. F3 t1 A: t; ^9 J7 b - $ws->on('open', function ($ws, $request) {* _ h. H$ k0 k, ?5 b6 S
- var_dump($request->fd, $request->get, $request->server);
% F/ U$ G4 }4 `# u4 J) d% \8 Q - $ws->push($request->fd, "hello, welcome\n");2 V p) }, U, {; Z
- });
" X$ R/ R& \+ J# O - 6 q& Z& |" A7 n( F
- //监听WebSocket消息事件
7 x0 E8 W) U# O1 N1 `% ^ - $ws->on('message', function ($ws, $frame) {4 h+ u& p) ^ p
- //推送消息给所有用户% C9 D8 K3 s. W7 L
- foreach($ws->connections as $fd){+ P) n; i1 h" E8 s& E: R
- $ws->push($fd, $frame->data);+ p% z8 S9 J' [8 p& o& v( ]
- }, C* v% _2 l4 L' L6 y2 f
- });
1 E% }# B: K: t/ x* d - - l2 B# V( ?' V- q' s+ T
- //监听WebSocket连接关闭事件2 g( d1 t% c* F8 x+ M
- $ws->on('close', function ($ws, $fd) {/ P* T3 A& ]6 Y! C3 a* U) k
- echo "client-{$fd} is closed\n";
' ^* z2 f& j Z6 v: ]8 E; ~' C - });( O: k; `' k/ Y. I* D! a0 X
- //启动服务
. b3 G6 e, A2 \3 T$ s$ t W - $ws->start();! A# P- N+ u+ F0 A) Z
- ! C9 p# o9 [& n, E- y; w; M5 i2 H! _
复制代码
$ |; Q" P5 O+ d' LWebsocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端
7 i! J# i* `) a9 c1 h) [/ @代码如下 - //连接服务器/ X& x9 c: M" p: b
- const socket = new WebSocket('ws://lm.com:9502');
?6 G) H1 J; D) b( d* Z0 f - //Connection opened' @: T2 Z* M/ h
- socket.addEventListener('open', function (event) {8 Y& |+ C3 n5 w6 ~0 ]+ F' ]
- //发送消息给服务器
& k. o& V) C3 G! U$ ` - socket.send('Hello Server! im websockt');3 P8 i, |" o$ {7 _
- });& ?9 i. I1 S/ {* Y+ C3 W
- // Listen for messages
( T* T& _. Q5 ~3 v; d( d6 D - socket.addEventListener('message', function (event) {' [# @" S! v5 w! u" g
- //接收服务器返回信息
4 d8 b2 R1 {" B# ^( ^2 v - console.log('Message from server ', event.data);5 k( t/ }, b7 E
- });
* c4 A8 v! k1 M4 C - - I. S8 t. v7 U9 r% L- ?+ B* D! f, e
复制代码 伪直播主播页面
! k4 \% a' \ d# [& n Khtml - <body>
/ g! V: W5 g9 o0 K - <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>/ }6 w+ R0 W. ?- l6 ] b5 V/ C
- <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
1 T# Y0 K; a3 s! V6 ~ - 画布
: p, @3 }7 l( B - </canvas>+ h N! }3 m+ T# h$ U& L8 z
- <img src="" id="videoImage" width="350" height="700">
" p% V% m- \, I) }4 _9 m - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>" X* r) {, P Z- H# v% b
- <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
2 c% z! W/ l' v6 g+ }0 [ - </body>
* l% F6 R. U. i2 W r; h$ L
复制代码javascript - var v = document.getElementById("myVideo");
' l" J7 |7 V# A7 O) z/ o4 f - var c = document.getElementById("myCanvas");
" q; E; k- m" P+ X$ G0 G - // var c = document.createElement("canvas");) P- p( m& H0 E
- var img = document.getElementById("videoImage");/ p* G0 w) P' G- U$ J
- ctx = c.getContext('2d');3 g4 `" N }# x: K6 K3 }. g$ H: C
- var dataUrl;
' M+ a( z; G0 Y( w4 R - const socket = new WebSocket('ws://xxxx.com:9502');
& j/ G; O% B9 R1 J4 C5 h - //Connection opened% h, b2 C0 y: d* o: u" [1 v
- socket.addEventListener('open', function (event) {2 T8 U% V7 S% l7 M9 Q
- // socket.send('Hello Server! im websockt');
' }0 v0 A& [ v( h, G5 D4 v* i! ^ - });
3 O& u& x" x. T. {2 b3 Q - // Listen for messages; j u* X1 d9 x1 H2 R; s* \, F
- socket.addEventListener('message', function (event) {4 h& _6 f9 C! n/ h3 k' C
- console.log('Message from server ', event.data);
! c: d7 u* i% H4 k1 k - img.src = event.data;( C# P3 o6 m- D1 Z$ t5 S9 g' V
- });
3 Z g8 j0 ^- G" l0 f, o - ) c. r4 M4 m, F4 M8 [
- function playVideo() {: U7 C8 C9 n* n* c+ g6 ]. T
- ctx.drawImage(v, 0, 0, 350, 700);
z$ C& R) }. v" Z0 @ - dataUrl = c.toDataURL("image/png");2 |! \ {. P+ n# s0 e- B' p) [ F
- // img.src = dataUrl;( N) l, l% k7 C# n
- socket.send(dataUrl);" e* E/ T5 I3 a" x% [2 w
- }
8 j: S# a- L& R( e - var tick;
- P$ _8 J$ `# K5 k$ m+ k! y6 d - function aphla() {
# ?5 B& [& l5 M9 K: X [ - tick = setInterval(function () {
: K2 `6 ~9 w3 M8 }2 E, y$ k" D0 i8 u - playVideo();
; \, `& ?; Q. t: o) }9 i3 H - }, 1);( K. m" |% G! d4 H
- }; k [8 U) j9 Z) u; O+ C! d! l
- function vdStop() {
7 W9 M7 v/ D3 c5 l/ Q4 | - clearInterval(tick);$ X: w5 D4 {5 ~+ P! f* w% y" l$ Z
- }
1 Z7 n* x: u B3 q
复制代码 用户页面# X9 R& `7 k+ ]# f0 m
html - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");* T* K8 b2 S6 P! n
- const socket = new WebSocket("ws://lm.com:9502");% t7 |# d9 d% i# ^+ e4 Z
- //
5 Z/ \% W4 M0 s/ ^ - socket.addEventListener('open',function(){
/ h) }8 f) | T6 S, C9 G% E - socket.send('Hello Server! Im live.html');
1 h% ?, t. u0 P- J% G - });
' N. G8 Y" n, k k: q; z - // Listen for messages% B, Q- e' q. l1 Z6 r1 V2 O
- socket.addEventListener('message', function (event) {
. g, ]5 C; D- H* x8 L - //图片地址( P# j+ X, f, R+ S+ L5 x: |
- img.src = event.data;
' W e& u. F* r y2 }( a+ d - });" n* X. `4 F% M1 X1 W( e9 q
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法
% S3 }8 W4 T( U/ B) @3 I: u5 g0 L5 c7 {
|
|