مرحبا،
لدي إعداد اختبار خادم socket.io بسيط يرسل التاريخ الحالي () إلى عميل واحد.
كل ثانية يرسل الخادم (يصدر) التاريخ () إلى عميل واحد.
إذا قمت بتحديث نافذة المتصفح ، فلا يزال لدي اتصال واحد ولكن الخادم يرسل إلى اتصالين .
إذا قمت بتحديث نافذة المتصفح ، فلا يزال لدي اتصال واحد ولكن الخادم يرسل إلى ثلاثة اتصالات.
إذا قمت بتحديث نافذة المتصفح ، فلا يزال لدي اتصال واحد ولكن الخادم يرسل إلى أربعة اتصالات.
وهلم جرا وهلم جرا...
حتى بعد عدة ساعات ، لا يزال يتم إرسال العملاء غير المتصلين إلى الخادم.
كنت أتوقع أن يقوم الخادم بإسقاط / إغلاق الاتصالات القديمة دون إرفاق عميل.
هل هذا سلوك متوقع؟
أنا أستخدم Socket.io v1.4.5 مع Node v5.4.1
إليك نموذج التعليمات البرمجية:
io.on('connection', function (socket) {
// console.log(socket.connected);
console.log('===================');
setInterval(() => {
console.log(socket.conn.id);
socket.emit('data', { ts: new Date() });
}, 1000);
});
إليك ناتج console.log عندما أقوم بتحديث المتصفح كل ثانيتين.
يمكنك رؤية socket.conn.id لكل تحديث للمتصفح يتم إرساله إليه.
❯ node app.js ⏎
===================
kkizbfn-82gNOsyAAAAA
kkizbfn-82gNOsyAAAAA
===================
kkizbfn-82gNOsyAAAAA
m_ft38Y4XEY7W97VAAAB
kkizbfn-82gNOsyAAAAA
m_ft38Y4XEY7W97VAAAB
===================
kkizbfn-82gNOsyAAAAA
m_ft38Y4XEY7W97VAAAB
xH09a5Olle4A-HSNAAAC
kkizbfn-82gNOsyAAAAA
m_ft38Y4XEY7W97VAAAB
xH09a5Olle4A-HSNAAAC
===================
m_ft38Y4XEY7W97VAAAB
xH09a5Olle4A-HSNAAAC
kkizbfn-82gNOsyAAAAA
_GmZXIXg8VgUrdKlAAAD
m_ft38Y4XEY7W97VAAAB
xH09a5Olle4A-HSNAAAC
kkizbfn-82gNOsyAAAAA
_GmZXIXg8VgUrdKlAAAD
حتى بعد عدة ساعات وعدم وجود عملاء (متصفحات) متصلة ، لا تزال الاتصالات القديمة تُرسل إليها.
تحتاج إلى مسح الفاصل الزمني عند قطع الاتصال باستخدام clearInterval.
var oneSecondInterval = setInterval(() => {
console.log(socket.conn.id);
socket.emit('data', { ts: new Date() });
}, 1000);
socket.on('disconnect', function(){
clearInterval(oneSecondInterval);
});
هذا يجب أن يمنعه من التمسك بالاتصالات القديمة.
@ StevenBock آه حسنًا .. نعم هذا جيد - شكرًا!
لدي نفس المشكلة مع هذا المثال الآخر.
أرغب في إنشاء ملف وإرسال كل سطر جديد إلى العميل.
باستخدام وحدة npm 'tail' ، يعمل هذا الرمز بشكل جيد ، ولكن لديه هذا التمسك بمشكلة الاتصالات القديمة:
const io = require('socket.io')(8080);
const Tail = require('tail').Tail;
const tailTmpFile = new Tail("./tmp.txt");
io.on('connection', function (socket) {
console.log(socket.conn.id);
tailTmpFile.on("line", function (data) {
console.log('emitting Yes: ', socket.conn.id);
socket.emit('file', { data: data, ts: Date() });
});
});
بطريقة ما أحتاج إلى التخلص من حدث الذيل (tailTmpFile.on) عند فصل المقبس.
@ StevenBock حسنًا ، حسنًا -
هذا الرمز يزيل مستمع الحدث عند قطع الاتصال.
io.on('connection', function (socket) {
console.log(socket.conn.id);
var emitLine = function () {
var callback = function (data) {
socket.emit('file', { data: data, ts: Date() });
}
tailTmpFile.on("line", callback);
// dispose function
return function() {
tailTmpFile.removeListener('line', callback);
}
}();
socket.on('disconnect', function () {
// dispose tail file listener
emitLine();
});
});
شكرًا جزيلاً على الوقت الذي استغرقته في الرد ، لقد وضعني حقًا في الاتجاه الصحيح.
هتافات.
سعيد للمساعدة!
التعليق الأكثر فائدة
@ StevenBock آه حسنًا .. نعم هذا جيد - شكرًا!
لدي نفس المشكلة مع هذا المثال الآخر.
أرغب في إنشاء ملف وإرسال كل سطر جديد إلى العميل.
باستخدام وحدة npm 'tail' ، يعمل هذا الرمز بشكل جيد ، ولكن لديه هذا التمسك بمشكلة الاتصالات القديمة:
بطريقة ما أحتاج إلى التخلص من حدث الذيل (tailTmpFile.on) عند فصل المقبس.