管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器! c% i3 ^: H9 r
- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1); ; I. v' r8 K7 g
- //创建socket服务
& ?. c. {7 \. u - $ws = new swoole_websocket_server("0.0.0.0", 9502);
7 O. ^( D' L+ |3 {, z - //监听WebSocket连接打开事件0 ?, d: L6 r( |5 Y
- $ws->on('open', function ($ws, $request) {0 d& b/ L; x% v! I
- var_dump($request->fd, $request->get, $request->server);
& F% l& p, N+ ~/ g$ g+ T - $ws->push($request->fd, "hello, welcome\n");
5 b# H' C+ ]3 G: w# t6 J - });6 N" ]6 ^5 o& X: z1 ?
- ' b; X" _: w. h* c' \
- //监听WebSocket消息事件
9 [6 j* ]. ^; X* ] - $ws->on('message', function ($ws, $frame) {7 p3 M* p. Z( O) t- {7 t1 {6 ~4 p2 U
- //推送消息给所有用户% e, s& `0 R# t5 M9 n! S$ e7 T9 n, H
- foreach($ws->connections as $fd){
5 z" I E h- {3 `1 A - $ws->push($fd, $frame->data);
n* M" e- H% M7 t1 }" \" H1 y0 ~1 i: | - }" [$ p( h, R }$ ?5 V
- });4 y+ V+ o2 p2 `4 y& v: k
- - l. u4 a! R7 i6 f/ [
- //监听WebSocket连接关闭事件
( Z$ \3 K% l, T. i - $ws->on('close', function ($ws, $fd) {
7 Y/ S q! b R5 \# g - echo "client-{$fd} is closed\n";
. P6 E: ?, n+ ?; \ - });; |0 d2 Q" M0 i5 a( x
- //启动服务
. K# F) b' U. E. i u - $ws->start();
9 n/ Y/ `! A; y/ ?5 d7 e
- L1 ~7 V$ t! \/ e, v: a
复制代码
. \/ V5 D% a8 q+ e; ?9 fWebsocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端
$ ?9 j+ ^# X. d6 t代码如下 - //连接服务器
3 M: ]4 ?) c" F1 ^ - const socket = new WebSocket('ws://lm.com:9502');8 }; v( h6 X4 L$ X" u3 C3 K
- //Connection opened" o* U% T, ?1 Y; R
- socket.addEventListener('open', function (event) {
- `& E; l3 G, u - //发送消息给服务器
' Y+ ]$ c3 \ D& N4 F+ p - socket.send('Hello Server! im websockt');
6 o" L3 `" [, |% p - });" u) K- {8 W$ X& u( _; K
- // Listen for messages# e9 _7 ?* Z3 c
- socket.addEventListener('message', function (event) {
. Z/ r- D; A+ o' X' E+ a1 w - //接收服务器返回信息
; p" W( g: h4 F( Q, o7 n& n- M - console.log('Message from server ', event.data);. M! a" `* p) A, N- h5 p& z( R1 S
- });
7 R" d3 P: ^" ]* d) r" V7 A
0 } ^% y. s9 {' h1 L
复制代码 伪直播主播页面
. `6 R' D$ f$ Y {; B: y: U( s: Dhtml - <body>
$ |4 R: L% N6 j! p4 U* q0 Q6 H - <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
3 q5 f$ k$ B$ p" U) P( ?/ b - <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">2 I0 @$ I* r6 _* _
- 画布
$ D3 A% f6 V+ P g: @" `' { - </canvas>: w" [+ X; N h8 K3 Y! A) |* ~
- <img src="" id="videoImage" width="350" height="700">% i& U2 U6 N0 t! Z3 T9 Q U4 Q+ e0 D
- <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
+ |% n3 Y) d7 a/ H - <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>% b, L0 @0 ]6 Z/ ?% g: z2 b1 ?) Q
- </body>
1 }! z3 y6 @0 t
复制代码javascript - var v = document.getElementById("myVideo");
- l1 Z5 K2 V6 Z8 H: l - var c = document.getElementById("myCanvas");
1 |' Q5 x! A( q! o/ g - // var c = document.createElement("canvas");1 [ E( N- U$ c# R: X
- var img = document.getElementById("videoImage");
* J! D/ H3 o5 @7 [/ M - ctx = c.getContext('2d');. J( c+ J9 U8 ^0 W8 ^6 M% x2 Z
- var dataUrl;: |/ o9 _4 A0 O! P
- const socket = new WebSocket('ws://xxxx.com:9502');
$ i. S3 F& L1 U. e - //Connection opened
, o2 h: E# k. ` - socket.addEventListener('open', function (event) {
5 g- H: T: q# v3 S6 l7 S - // socket.send('Hello Server! im websockt');
, X7 _8 T- ?& N% T. ` - });
2 X0 @* i% m$ v3 ]/ H5 ^ - // Listen for messages. F5 B6 \4 m) S) E h4 Q7 _
- socket.addEventListener('message', function (event) {$ T- z- [- n% A5 C$ `' B
- console.log('Message from server ', event.data);. j# x+ @; j! s% O' c) K& V
- img.src = event.data;
* n2 d x: P3 A4 S( d: W- ` - });
( }( j8 m" B8 ? - + }3 [$ @0 L4 H) R
- function playVideo() {
% Z# U7 u( H4 Z, W% c# u/ a - ctx.drawImage(v, 0, 0, 350, 700);: d8 S5 W, K+ H8 X6 J
- dataUrl = c.toDataURL("image/png");
. m' H% V6 F/ W' @/ i/ a- Y# P - // img.src = dataUrl;8 S3 I7 k; n G8 s
- socket.send(dataUrl);9 h3 F5 I0 r+ Y
- }5 \& J+ }' ~. t/ l* j5 f7 p
- var tick;
. m5 S# [ k& C - function aphla() {9 |6 J. ]' s& ~2 M. D/ S
- tick = setInterval(function () {
$ B" u$ w6 W+ t: j9 H8 k+ t; a1 d - playVideo();
/ @6 X# T2 `+ J9 W! R* v - }, 1);
[& V h9 A; r5 z* k" h0 d! V - }; U6 Z$ R" y+ Z, S* k. O
- function vdStop() {
2 w: i" S8 `# b - clearInterval(tick);
" x$ |& H* j, L0 z - }; X& _# p0 O' Q: S2 b I$ f
复制代码 用户页面6 c: ^" _. f. ~/ ~
html - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");
0 E/ P4 Y$ }$ l2 M% `+ x2 o - const socket = new WebSocket("ws://lm.com:9502");
6 M# l4 c3 R/ \+ P) U - //1 G$ Y' ]7 [- K. |; X
- socket.addEventListener('open',function(){$ W. C9 e5 D+ ?8 t3 G r+ s% p1 G
- socket.send('Hello Server! Im live.html');
0 s5 K8 n& w- W$ @1 J - });; y0 F- w* N+ _0 t% w2 S
- // Listen for messages$ A4 A: V0 X4 i
- socket.addEventListener('message', function (event) {
+ e0 ?* V+ n) y; \& _ - //图片地址7 p1 x7 M2 L+ @
- img.src = event.data;3 K# P) O2 j* D3 d: J
- });
5 `% U9 n: S' {0 w
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法 , h7 W! }2 g* ~
n: s, I1 c/ i4 G# l+ {& m |
|