管理员
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器: j0 W/ \6 y3 Z
- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1);
1 X6 Y2 @; P$ v - //创建socket服务, N* S* z; o1 L C4 Z! [
- $ws = new swoole_websocket_server("0.0.0.0", 9502);
! c' J6 K- B- h - //监听WebSocket连接打开事件
0 o' {& }* @4 b0 D4 c - $ws->on('open', function ($ws, $request) {
4 H0 G; N2 I: c7 S! v8 h, n - var_dump($request->fd, $request->get, $request->server);
, N3 @9 I- [4 ~# i - $ws->push($request->fd, "hello, welcome\n");% j- Y4 B& S! } Y4 U
- });. q t3 L* @4 n
- % y/ l+ `% v9 g1 Z) j* W/ U
- //监听WebSocket消息事件9 ]( ?( G K# {% H$ M q7 i, P! e G9 O
- $ws->on('message', function ($ws, $frame) {* ^8 Y* n/ {2 ]0 o* l/ x
- //推送消息给所有用户
; @7 K) J3 ~7 c' Q, Q. i' Z - foreach($ws->connections as $fd){
( |3 y }0 ?: R' {; } h: `/ _ - $ws->push($fd, $frame->data);" c: _. `# j% \+ x
- }% y1 b% j+ M3 `! R9 W
- });/ x9 k$ ?. w( b2 M; F
- " Q3 K I/ F* o4 O: z
- //监听WebSocket连接关闭事件) ^0 e$ p! g3 ] h! W
- $ws->on('close', function ($ws, $fd) {
0 u$ G1 `0 a% p - echo "client-{$fd} is closed\n";7 K+ E, ]! e9 [* T+ ~. y
- });
2 q2 J/ u& q2 J2 s1 q - //启动服务" B" f5 L# P5 p6 Q
- $ws->start();- ? M, O6 R- j- V
- . U( X, Y, }( E3 E5 X' O* U
复制代码 8 @) Z; x' g, Q0 w3 T3 c+ H V
Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端
* N# _3 w9 c5 |7 @( t0 [代码如下 - //连接服务器* k! u; A. `/ c
- const socket = new WebSocket('ws://lm.com:9502');
# M+ A0 M6 p( z3 L. z - //Connection opened
- m: Z# P" g: D/ C8 P - socket.addEventListener('open', function (event) {
% b% m) H, X, D/ |0 j - //发送消息给服务器
$ M+ ? g$ @0 v! T. B) _* f - socket.send('Hello Server! im websockt');
# a1 L/ X1 _% g8 r/ X: Y& K - });. F6 {; Q: A$ y1 @& j+ M
- // Listen for messages
" H7 [$ v& F. \3 e, ~2 K) Q' L$ M - socket.addEventListener('message', function (event) {
; N! F3 ^6 S; r; h - //接收服务器返回信息
' s! e j9 g5 H/ g6 i - console.log('Message from server ', event.data);
2 R. v' b. Y: E5 e - });
5 p* @& {& w; c4 r2 Z, x" O! W - ; ~; F6 E6 R/ f; ^# \ P
复制代码 伪直播主播页面
" Y2 l9 o7 t8 @0 j, jhtml - <body>- x5 k6 |/ O" y0 [- R5 Q( H
- <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video> A( _2 B: G& U( ?- X
- <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
" ?# W& M ~; l* \' Q - 画布
( D6 ?, g2 C+ t `+ p - </canvas>. t% E* c4 }: E2 P1 U( ~( Q0 \" z
- <img src="" id="videoImage" width="350" height="700">
& L* {3 C% J, |5 h/ G! e' m - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
9 U! `8 V! j' k: S - <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>$ r* \) ~7 J: ~0 E
- </body>8 p, P1 _2 e7 F5 B
复制代码javascript - var v = document.getElementById("myVideo");
$ h( ]- D( Y. A5 Q8 j1 d" `( c" D - var c = document.getElementById("myCanvas");
% Y& g, B7 s) C9 |8 J - // var c = document.createElement("canvas");
8 h9 {4 I% L- H - var img = document.getElementById("videoImage");
, @1 q. }1 X, ?) f9 }. t. u" Z z A, z - ctx = c.getContext('2d');
U5 m- x6 [9 u - var dataUrl; ^5 e- M! q1 L- D* m3 b
- const socket = new WebSocket('ws://xxxx.com:9502');
' E8 E( l; G% \& y- T( J% n - //Connection opened
& Z5 d. R) M2 s - socket.addEventListener('open', function (event) {
# q" Q5 c. h2 i$ r - // socket.send('Hello Server! im websockt');+ g6 f; w6 v; t# I
- });; D3 W0 h, w8 g1 P
- // Listen for messages
0 W" i3 T, C4 F. P! ^- M" W - socket.addEventListener('message', function (event) {
! P6 O2 f( u! m: }, s' T - console.log('Message from server ', event.data);
' y+ \7 Y: K6 O9 a. o4 h; j3 p/ O - img.src = event.data;) l. L; o8 G6 i* j) v) q
- });6 Y/ g, F7 v; P. b$ h
- 2 E$ z4 V3 Y7 j) y9 w
- function playVideo() {
3 q: v7 R. f' W/ X3 ^/ A1 x - ctx.drawImage(v, 0, 0, 350, 700);
' o. P" t3 r( D& j - dataUrl = c.toDataURL("image/png");% X8 B) u" S }& k3 E
- // img.src = dataUrl;- P. @, h- m4 ^2 g: N J) X& H1 J
- socket.send(dataUrl);
1 u- Y O5 M E" m* Z - }
: `5 V4 Y5 b" |6 J - var tick;
& g4 z0 j$ O& ~2 P& O( i - function aphla() {
! j# P! }6 }/ b" e2 m - tick = setInterval(function () {
( L" G; |" V$ L- [0 I0 F - playVideo();1 _2 M0 E' E( _( j: S$ M
- }, 1);
9 y" U ~/ c9 b - }, f. h3 u! ?! D; A/ Z, J# Y
- function vdStop() {6 W/ ?% f4 H/ m
- clearInterval(tick);
! F: Y. n2 r' l7 \0 e - } J+ O/ ~7 Z# e# Z5 V
复制代码 用户页面) _2 }7 g$ y2 W. `; W
html - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");
, q5 ?9 Q$ M5 {. `6 E4 _ - const socket = new WebSocket("ws://lm.com:9502");
! x2 K5 G6 z$ L1 }7 a - //1 ~* Y- e2 V8 W. K( d
- socket.addEventListener('open',function(){+ v; g9 S# n: M. X5 k8 @! j
- socket.send('Hello Server! Im live.html');- s4 r5 ^4 J" j M$ e
- });2 H5 s7 q+ `# a8 e2 z5 i
- // Listen for messages/ U3 t4 h; G% ~+ p# [
- socket.addEventListener('message', function (event) {
* S0 F: N5 _. ^! n: Y - //图片地址
6 i# P/ c9 U% F" F* q9 ?) |! g - img.src = event.data;
( Z6 y9 h- t7 e - });" Q- ^6 ?( ? E" N1 n; F4 v
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法 * J/ U+ h7 S2 o- V5 M
5 K6 K0 J1 q [5 W& k |
|