Еще вопрос, может кто знает, как закрыть соединение????? принудительно.
Вопрос, к тому, что по событию close делаю this.spcket = null, а потом вызываю опять connection то все равно ничего выходит |
|
коллеги, всем спасибо, решил задачу.
Все работает, отлично и быстро |
что сделал то?)
|
SuperZen, радость была преждевременной)))))))))))))))
Дабы исключить ошибку соединения сокета, я перед созданием экземпляра, пульнул ajax на сервер, и если он мне вернул код 200 то все ок, создаем и вешаем слушатели open и close. по событию close просто снова вызываем connection. Вот код: 'use strict'; window.SocketModule = (function(window) { class SocketModule { constructor(options) { this.socket; this.path = options.path; this.connection(); this.reconnectCount = 60; } connection() { const _t = this; this.checkServer(function(server) { if (!server) return; _t.socket = new WebSocket(_t.path); _t.socket.addEventListener('open', function() { _t.indicatorControl(true); }); _t.socket.addEventListener('close', function() { _t.indicatorControl(false); _t.connection(); }); }); return this; } checkServer(callback) { let timer; const _t = this; let count = 0; timer = setInterval(function() { const req = new XMLHttpRequest(); req.open('GET', '/api/connect', true); req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); req.send(null); req.addEventListener('load', function() { if (req.status === 200) { clearInterval(timer); callback(true); } }); count++; if (count === _t.reconnectCount) { clearInterval(timer); console.log('Превышен лимит ожидания!'); } }, 200); return this; } sendMessage(event_name, data) { if (event_name.constructor.name === 'String') { const _t = this; // this.readyStateConnection(function() { _t.socket.send(JSON.stringify({event_name, data})); // }); } else return; return this; } readyStateConnection(callback) { let timer; clearTimeout(timer); if (this.socket.readyState === 1) { callback(); } else { const _t = this; timer = setTimeout(function() { _t.readyStateConnection(callback); }, 0); } } }; return SocketModule; })(window); НО!!!!!!!!!!!!!!!!!!!!!!!!!))))))))))))))))))))) ) Когда я вызываю метод sendMessage в другом классе: 'use strict'; window.Chat = (function(window) { const options = window.options; const socketModule = window.SocketModule; const ServiceModule = window.ServiceModule; const MessageModule = window.MessageModule; class Chat { constructor() { this.transport = new socketModule({ path: options.socketPath }); } init() { this.transport.sendMessage('chat_message', { type: 'text', text: 'Lorem ipsum dolor sit amet, megatron7000' }); } } return Chat; })(window); Эта шайтан машина))) выдает мне - annot read property 'send' of undefined! В методе readyStateConnection this.socket = undefined!!!! если вывести в консоль this, то он есть, а если this.socket его нет. |
Теперь встал вопрос в том, видимо где я потерял контекст???????!!!!!!!!!! или просто туплю сижу.
|
server.js
var path = require('path') var http = require('http') var express = require('express') var WebSocket = require('ws') const app = express() const httpServer = http.createServer(app) const wss = new WebSocket.Server({ server: httpServer }) app.use(express.static(path.join(__dirname, 'public'))) app.get('/', function (req, res) { res.sendfile(path.join(__dirname, 'public', 'index.html')) }) wss.on('connection', (client) => { client.on('message', (message) => { console.log('message: ', message) client.send('ok') }) client.send('connected') }) httpServer.listen(2999, () => { console.log('started at http://localhost:2999') }) public/index.html <html> <head> </head> <body> <div id="connection">not connected</div> <button id="button">Send</div> <script> var connection = document.getElementById('connection') document.getElementById('button').addEventListener('click', function () { ws.send('message') }) var ws function connect() { console.log('connecting') connection.innerHTML = 'connecting...' ws = new WebSocket('ws://localhost:2999') ws.addEventListener('open', wsOpenEvent) ws.addEventListener('close', wsCloseEvent) ws.addEventListener('message', wsMessageEvent) ws.addEventListener('error', wsErrorEvent) } function wsOpenEvent(e) { console.log('connected') connection.innerHTML = 'connected' } function wsCloseEvent(e) { console.log('close') connection.innerHTML = 'disconnected' setTimeout(() => connect(), 5000) } function wsMessageEvent(e) { console.log('message', e) } function wsErrorEvent(e) { console.log('error', e) } connect() </script> </body> </html> package.json { "name": "web_socket", "version": "1.0.0", "main": "index.js", "license": "MIT", "dependencies": { "express": "^4.16.3", "ws": "^6.0.0" }, "scripts": { "start": "node server.js" } } я так сделал reconnect ) и модули бы делал через webpack или parcel ) |
SuperZen, по сути то же самое, но только Реконнект делает через 5 секунд. Я так тоже сделал сначала)))) но теперь вопрос не в Реконнекте, а в том что контекст потерялся и при вызове из другого места ошибка
|
SuperZen, можно по идее сделать и без проверки доступности сервера, но тогда при создании нового экземпляра будет ошибка в консоли и все. Оборвать попытки, например, через 30 секунд и выдать клиенту сообщение какое нибудь, что серверу кранты. Вот.
У меня задача стоит, сделать коннект по сокет соединению, если обрыв то реконнект. Обязательно что бы модульная система была. Дабы коллеги вникали сразу, что бы использовать можно было в разных модулях. |
Реконнект сделал, работает отлично. А вызывать не могу в других местах))))))))))))))))))))))
|
Часовой пояс GMT +3, время: 10:10. |