nodejs搭建的web模块主要负责接收视频信息,转发视频信息,唯一复杂的地方在于要记录每一个与服务器建立了连接的客户端,将图像发送给相应的每个客户端,这里我使用了一个全局对象构造的连接池,请看代码
-
//加载配置文件
-
var config = require("./config");
-
//引入http模块
-
var httpServer = require("http");
-
//引入UDP模块
-
var dgram = require("dgram");
-
var net = require('net');
-
//引入path模块
-
var path = require('path');
-
//引入express模块
-
var express = require('express');
-
//引入express模块
-
var app = express();
-
var http = httpServer.Server(app);
-
//初始化socket连接
-
var io = require("socket.io")(http);
-
var serverSocket = dgram.createSocket("udp4");
-
serverSocket.bind(config.udpImagePort);
-
//初始化连接池
-
var connections = {};
-
var connectionid = new Set();
-
//初始化全局变量
-
var isWarning = true;
-
app.use(express.static(path.join(__dirname, 'public')));
-
app.set("views",path.join(__dirname,"views"));
-
app.set("view engine","html");
-
app.engine(".html",require("ejs").__express);
-
app.get("/",function(req,res){
-
res.render("camera.html");
-
})
-
//监听websocket连接
-
console.info("开始websocket监听...")
-
io.on("connection",function(socket){
-
//监听到连接时,将socket加入连接池中
-
socket.send("连接成功");
-
connections[socket.id] = socket;
-
connectionid.add(socket.id);
-
console.info("增加一个连接,当前连接数量为"+connectionid.size)
-
//获得来自网页的视频设置信息
-
//断开连接时,将连接从连接池中删除
-
socket.on("disconnect",function(){
-
delete connections[socket.id];
-
connectionid.delete(socket.id);
-
console.info("删除一个连接,当前连接数量为"+connectionid.size);
-
});
-
})
-
//监听udp连接,如果有画面,将画面广播出去
-
serverSocket.on("message",function(msg,info){
-
for(var a of connectionid){
-
connections[a].send(msg);
-
}
-
});
-
//开启应用
-
http.listen(config.listenPort,function(socket){
-
console.info("listening on "+config.listenPort);
-
});