首先是前端做好准备:
// websocket_path: "ws://10.10.226.3:3030/ws",
state.socket = new WebSocket(state.websocket_path);
// 监听socket连接
state.socket.onopen = function() {
console.log("frist socket连接成功");
};
// 监听socket错误信息
state.socket.onerror = function() {
console.log("frist socket连接错误");
};
state.socket.onmessage = (evt) => {
// evt.data.split("data:");是后端返回的图像信息
var all_data = evt.data.split("data:");
state.img_b64 = "data:image/jpg;base64," + all_data[0];
if (numb == 3) {
this.commit("demo");
numb = 0;
} else numb++;
};
state.socket.onclose = function() {
console.log("frist socket已经关闭");
state.is_init = !state.is_init;
};
接下来就是nodejs(正文):
// 创建长连接,双工通信协议
var webSocketServer = new WebSocketServer.Server({ port: 3030 });
webSocketServer.on("connection", function connection(ws, req) {
var ip = req.socket.remoteAddress;
var port = req.socket.remotePort;
var clientName = ip + "/" + port;
console.log("%s is connected", clientName);
ws.on("message", function (message) {
if (message == "start") {
wp = child_process.spawn("python.exe的路径",["ai算法.py"]);
// 算法程序会将每一张处理过后的图像以输出流的方式传输过来。
wp.stdout.on("data", function (data) {
img_result_b64 = data.toString("utf-8");
ws.send(img_result_b64);
});
wp.on("message", function (data) {
console.log("exit:" + data);
});
wp.on("close", function (code) {
console.log("子进程已退出,退出码 " + code);
});
wp.on("exit", function (code) {
console.log("进程退出码是:", code);
});
}
// 当前端发送stop指令就关闭算法程序
if (message == "stop") {
console.log("frist:" + wp.pid);
process.kill(wp.pid);
}
});
});
最后是算法程序:
# 对图像二进制数据进行base64编码
img_result_b64 = base64.b64encode(img_result_b64)
# 以标准输出流进行传输
sys.stdout.write(str(img_result_b64, 'utf-8').strip(r'=+'))
总结:
首先是,如果算法程序使用输出为数值字典值则会转为Buffer值,而字符串可以直接获取不需要转换。
流程为前端点击开始——》服务器收到后执行py文件——》py文件调用网络摄像头并开始执行算法程序——》将图像信息进行编码后传输给服务器——》服务器再返回给前端——》直到前端点击停止——》服务器将程序进行关闭