javascript - 客户端重新加载/离开页面后 Socket.io 服务器崩溃
问题描述
我有一个奇怪的情况。我正在编写一个用于从 ip 摄像机流式传输 rtsp 的 Web 应用程序。一切都很好,除非当客户端观看流重新加载或离开页面时服务器崩溃(并非总是如此)。
这是崩溃输出:
zlib.js:499
var newReq = self._handle.write(flushFlag,
^
TypeError: Cannot read property 'write' of null
at Zlib.callback (zlib.js:499:33)
服务器端:
const app = require('express')();
const child_process = require('child_process');
const server = require('http').Server(app);
const io = require('socket.io')(server);
io.of('/stream').on('connection', function(socket) {
let room;
socket.on('startStream', function(camuid) {
room = camuid;
let stream;
socket.join(room);
if (processes.indexOf(camuid) == -1) {
processes.push(camuid);
logic.Onvif.getStreamLink(camuid).then(rtsp_link => {
stream = child_process.spawn("ffmpeg", [
'-y',
'-re',
"-i", rtsp_link,
'-f', 'mjpeg',
'-'
], {
detached: false
});
stream.stdout.on('data', (data) => {
const frame = Object.values(new Uint8Array(data));
socket.nsp.to(room).emit('camfeed', frame);
});
}).catch((e) => {
socket.nsp.to(room).emit('streamError', true);
});
}
});
在客户端:
const io = require('socket.io-client');
socket = io.connect(`http://${location.hostname}:8088/stream`);
socket.on('connect', function() {
socket.emit('startStream', $this.$props.id);
});
socket.on('camfeed', function (data) {
//Here the data is displayed on canvas
});
我试图找出服务器中的哪一部分代码导致了这种行为,但到目前为止没有运气。
我尝试将函数、侦听器和发射器放入try{}catch
每console.log
一步,以查看它在哪里停止,但输出并不总是相同。
所以我开始寻找解决方案,发现一个github问题说zlib负责在发送之前将数据压缩到gzip,并且错误是由于尝试处理不存在的数据引起的。另一方面,我没有安装 zlib 作为依赖项,据我所知 zlib 包不再使用,因为 node 内置了这个功能。我搜索node_modules
并找到了 minizlib 包,但不知道该依赖是谁。
解决方案
我相信你需要使用
socket.on("disconnect",function(){
//delete all user data here
})
所以它停止使用您创建的对象
推荐阅读
- java - 设置 Selenium FirefoxProfile 设置不一致
- python - 当数组既不为空也不损坏时,从音频文件构建的 NumPy 数组会引发零大小数组错误
- mysql - 在 SQL 中根据日期标记某些行
- angular - 在 Angular 6 中使用 ng2-smart-table 创建服务器端分页
- python-3.x - 在python中的字典中压缩任意数量的列表
- airflow - 使用气流的 DataflowPythonOperator 安排数据流作业时出错
- android - Android Gradle 回退到另一个构建变体
- c# - UnmanagedExports 错误“RGiesecke.DllExport.MSBuild.DllExportAppDomainIsolatedTask”
- google-app-engine - 如何从 AppEngine 开发服务器访问 k8s 服务
- python - 熊猫分钟数据可变长度窗口从现在到关闭时间查找最小值