Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 17.09.2018, 14:25
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

Еще вопрос, может кто знает, как закрыть соединение????? принудительно.

Вопрос, к тому, что по событию close делаю this.spcket = null, а потом вызываю опять connection то все равно ничего выходит
Ответить с цитированием
  #12 (permalink)  
Старый 17.09.2018, 16:03
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

https://developer.mozilla.org/ru/doc...bSocket#close()
Ответить с цитированием
  #13 (permalink)  
Старый 18.09.2018, 12:20
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

коллеги, всем спасибо, решил задачу.
Все работает, отлично и быстро
Ответить с цитированием
  #14 (permalink)  
Старый 18.09.2018, 14:08
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

что сделал то?)
Ответить с цитированием
  #15 (permalink)  
Старый 18.09.2018, 14:23
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

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 его нет.
Ответить с цитированием
  #16 (permalink)  
Старый 18.09.2018, 14:25
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

Теперь встал вопрос в том, видимо где я потерял контекст???????!!!!!!!!!! или просто туплю сижу.
Ответить с цитированием
  #17 (permalink)  
Старый 19.09.2018, 00:37
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 641

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 )
Ответить с цитированием
  #18 (permalink)  
Старый 19.09.2018, 04:32
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

SuperZen, по сути то же самое, но только Реконнект делает через 5 секунд. Я так тоже сделал сначала)))) но теперь вопрос не в Реконнекте, а в том что контекст потерялся и при вызове из другого места ошибка
Ответить с цитированием
  #19 (permalink)  
Старый 19.09.2018, 06:46
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

SuperZen, можно по идее сделать и без проверки доступности сервера, но тогда при создании нового экземпляра будет ошибка в консоли и все. Оборвать попытки, например, через 30 секунд и выдать клиенту сообщение какое нибудь, что серверу кранты. Вот.

У меня задача стоит, сделать коннект по сокет соединению, если обрыв то реконнект. Обязательно что бы модульная система была. Дабы коллеги вникали сразу, что бы использовать можно было в разных модулях.
Ответить с цитированием
  #20 (permalink)  
Старый 19.09.2018, 06:49
Профессор
Отправить личное сообщение для Роман Андреевич Посмотреть профиль Найти все сообщения от Роман Андреевич
 
Регистрация: 12.08.2016
Сообщений: 299

Реконнект сделал, работает отлично. А вызывать не могу в других местах))))))))))))))))))))))
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение файла на стороне клиента annie88 Javascript под браузер 18 13.01.2016 10:44
Сохранение файла на стороне клиента. doox911 Общие вопросы Javascript 2 17.01.2014 00:49
Создание миниатюры на стороне клиента RE_ Общие вопросы Javascript 30 04.01.2011 19:28
Получение текстовой области на стороне клиента sukubba Общие вопросы Javascript 2 18.04.2010 19:10
Проверить размеры изображения на стороне клиента kez jQuery 2 19.05.2009 11:23