管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
伪直播功能Websocket服务器
* u0 t3 x# ?' i" _- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下 - error_reporting(-1);
1 z) s/ n5 S2 e- x9 W - //创建socket服务! l1 b" [* s0 ?# i8 K! P: n, T& V
- $ws = new swoole_websocket_server("0.0.0.0", 9502);
- ]9 H4 H w" i& t9 T, y" o - //监听WebSocket连接打开事件
8 |% Q' |2 \- a3 E0 Y3 | - $ws->on('open', function ($ws, $request) { ^! P( t+ M, @) n
- var_dump($request->fd, $request->get, $request->server);: K* t8 W# ~* ~" t2 l+ I: l
- $ws->push($request->fd, "hello, welcome\n");
; o! `6 k) f- M; @9 n - });
+ ]* L$ u4 s) Q0 r - . j5 G% F3 W$ t F. Z
- //监听WebSocket消息事件2 l: B; B+ W& N
- $ws->on('message', function ($ws, $frame) {4 x/ S( u5 q; v' i, }9 }& X
- //推送消息给所有用户& I K& R) t9 W" s5 O$ z9 `
- foreach($ws->connections as $fd){/ z8 T; r7 J# s# E2 M! P$ [0 G# p/ q
- $ws->push($fd, $frame->data);
' s, Q" [- ?) O/ { - }2 o* l! p8 H7 q; j& b& p
- });
3 m# P7 y% N$ t6 j2 Z: T0 _1 E) D) M
' T% D: o6 f, p- //监听WebSocket连接关闭事件9 M1 i2 b; f+ l* B. D$ X
- $ws->on('close', function ($ws, $fd) {
' ?; }7 A+ N5 M# G - echo "client-{$fd} is closed\n";- ~& Z$ M) }! t$ @$ w
- });
% L: l1 N- J' }8 F3 l* y' U - //启动服务; u4 Z) Y" d' ]
- $ws->start();
( `9 B5 S6 `1 R% w7 D; b2 N0 b; w2 B! x+ h
1 J8 t" w" O; ]. s
复制代码
% h( b' T2 j! O9 \Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端
; }3 X* Q0 f- V4 e# }; H% K代码如下 - //连接服务器
v! Q1 A, @& s2 u - const socket = new WebSocket('ws://lm.com:9502');; C. N5 v: Z/ D0 {
- //Connection opened3 m% J' d( y0 C8 M$ H
- socket.addEventListener('open', function (event) {
6 [3 |0 e4 q) ^/ H( s5 ]& G - //发送消息给服务器
1 b- V6 w: `% {1 x - socket.send('Hello Server! im websockt');4 _$ g3 j. `3 X
- });9 `# [* Z) L& f- g6 W' F0 S/ b
- // Listen for messages
6 |- y9 L% f O' n - socket.addEventListener('message', function (event) {
7 @' q3 v+ {8 s( k: A - //接收服务器返回信息
, Z! o5 P; {4 s- h - console.log('Message from server ', event.data);: ]$ O% \1 D, C. o8 W+ g4 r+ \
- });9 p/ z4 @6 P$ F8 S" R. v( G
- # P. h( V7 a2 e: i4 @4 e
复制代码 伪直播主播页面
4 a% H, |0 B3 o& Vhtml - <body>' `) u- ~5 B6 w6 z1 H' H' U
- <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>4 f4 I& F( g& B0 W9 x) v
- <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">0 r7 U$ u1 L5 b6 ~# E3 s" ]
- 画布
' ]' L* n2 B5 D. V4 X0 T# D" Q2 C: o- m - </canvas>
6 |! p6 y' _" {8 j$ G; v - <img src="" id="videoImage" width="350" height="700">
/ |( M9 d: r' w j0 p+ l4 A - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>( z* h+ h+ q8 q. B6 C4 [$ ?
- <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>& a3 F0 h" I% I/ O: q
- </body>
: l! X. K* A1 I2 i
复制代码javascript - var v = document.getElementById("myVideo");
. W o) R( l) m) p/ L% m7 S - var c = document.getElementById("myCanvas");
$ g! {' C. ~9 p+ t - // var c = document.createElement("canvas");) H+ G3 D# H. k7 B
- var img = document.getElementById("videoImage");1 n6 _# e" W; z# `# i4 |
- ctx = c.getContext('2d');# t' _. I4 O' t, j3 i' h
- var dataUrl;+ P1 y$ `7 ]2 [2 R( |% ~
- const socket = new WebSocket('ws://xxxx.com:9502');
5 p( k! c# o0 k; _3 J - //Connection opened
8 K0 T3 l- t- [6 j/ p) ~. { - socket.addEventListener('open', function (event) {
& l9 o4 O+ a7 F$ G - // socket.send('Hello Server! im websockt');
* d/ v5 D# k9 z1 ^ k3 Z# ~ - });1 _/ q# w* l7 l$ c d
- // Listen for messages9 f! ^4 n" s: G3 B2 y
- socket.addEventListener('message', function (event) {, J, X/ I L; p( i: }; y6 T
- console.log('Message from server ', event.data);& H0 W* R8 F! K& o3 y
- img.src = event.data;
+ t/ k! t ^& X! V# ]$ u3 J - });
% l. u$ I; W7 `. K) w. ~' V
( U( u: z6 g/ ]( q/ P) x- function playVideo() {- V3 C+ E4 a: D' U+ X! i" b! o
- ctx.drawImage(v, 0, 0, 350, 700);2 {: Q( N& |+ v2 O/ h: B, H( N5 E
- dataUrl = c.toDataURL("image/png");
" ~( V3 W7 G% _ - // img.src = dataUrl;
! @: S9 w* j8 _ P; u" Y2 z- q - socket.send(dataUrl);
' Q: x) R1 s/ S* D2 m0 V6 e - }! ?4 Z- v6 H R N: ^- |
- var tick;
( r% Q8 ?6 v" u$ L; r$ `/ P - function aphla() {: E: ?0 ^3 W& F3 g" w
- tick = setInterval(function () {2 |4 m% P# l2 O1 m1 l% U4 D- G
- playVideo();
" m2 x( a% |; o% P - }, 1);
2 D$ Y, t9 \- Z$ g* A# H) g: h$ m - }
- p9 h, j3 O8 X- t8 F5 g - function vdStop() {
4 g# R5 x, R X4 P% w& I9 P0 Z/ Z - clearInterval(tick);
' R# i; v% [, X3 u5 u9 l: h" j - }# z, Y1 s' ^- j
复制代码 用户页面
' A! I( E( B( T- Z, \" h! Ghtml - <img src="" id="liveImg">
复制代码javascript - var img = document.getElementById("liveImg");
8 O( g# l2 p3 b - const socket = new WebSocket("ws://lm.com:9502");
! n7 e* M; L4 A9 u - //
" ~8 f; _" U) X$ V" X# ?6 c: W - socket.addEventListener('open',function(){
$ @# W* p/ P5 V* i# u - socket.send('Hello Server! Im live.html');# R! |+ T" u) w+ U9 y& c' O) `0 ~# r
- });* w* k$ Q4 z( l
- // Listen for messages
5 z0 a! |3 W( X( M - socket.addEventListener('message', function (event) {# Z; {' j1 E# @4 a1 l
- //图片地址% `4 }7 Q# W0 g' _$ P" _ i$ x
- img.src = event.data;# t8 y$ J7 Z. ~5 f4 z8 ?% k9 Q
- });
; I7 H5 b! h) M, b$ e& v% K
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法 3 U2 E: D8 C2 l+ x
) u b9 Z8 ]" k! P! B# M3 H8 R) {
|
|