Помогите с вебсокет



  • На сайте можна получать информацию через вебсокет (без авторизации на самом сайте).
    Я проверил, будет ли работать получение на http://websocket.org/echo.html . Все работатает.

    8ea83580-26a3-48bf-bb4d-b908b562ee33-image.png

    Но код, которий создан на примере echo.websocket.org demo не хочет работать, идет ошибка 400.

    Вот сам код:

    const WebSocket = require('ws');
     
    const ws = new WebSocket('wss://playdrop.org/socket/?EIO=3&transport=websocket/', {
      origin: 'https://playdrop.org'
    });
     
    ws.on('open', function open() {
      console.log('connected');
      ws.send(Date.now());
    });
     
    ws.on('close', function close() {
      console.log('disconnected');
    });
     
    ws.on('message', function incoming(data) {
      console.log(`Roundtrip time: ${Date.now() - data} ms`);
     
      setTimeout(function timeout() {
        ws.send(Date.now());
      }, 500);
    });
    


  • @fOrest94 в 1 варианте у вас указан wss, а во 2 вариаете ws

    у меня на https://www.websocket.org/echo.html не заработали
    ни wss://playdrop.org/socket/?EIO=3&transport=websocket/
    ни ws://playdrop.org/socket/?EIO=3&transport=websocket/



  • @tet-vivi said in Помогите с вебсокет:

    ws://playdrop.org/socket/?EIO=3&transport=websocket/

    Проверил вебсокет без защиты (ws) не хочет работать на сайте.
    wss://playdrop.org/socket/?EIO=3&transport=websocket отлично работает, главное в конце слэш не ставить.

    Вы меня натолкнули на мисль, что надо и в коде вконце слэш забрать и зароботал вход. Законектилось. Сейчас надо как то реализировать получения сообщений.



  • @fOrest94 said in Помогите с вебсокет:

    @tet-vivi said in Помогите с вебсокет:

    ws://playdrop.org/socket/?EIO=3&transport=websocket/

    Проверил вебсокет без защиты (ws) не хочет работать на сайте.
    wss://playdrop.org/socket/?EIO=3&transport=websocket отлично работает, главное в конце слэш не ставить.

    Вы меня натолкнули на мисль, что надо и в коде вконце слэш забрать и зароботал вход. Законектилось. Сейчас надо как то реализировать получения сообщений.

    Вы же синхронизируете код в действии ноды?
    https://community.bablosoft.com/topic/4450/websocket-на-node-js/6



  • @fOrest94 said in Помогите с вебсокет:

    console.log(Roundtrip time: ${Date.now() - data} ms);

    Странная строка, из даты вычитается сообщение? )



  • @Fox Вот так это выглядит.
    955cb240-9e9a-47ec-a769-216184f5d388-image.png resolve()

    Но сообщения в лог не идет о коннекте. Не знаю в чем причина.



  • @fOrest94 said in Помогите с вебсокет:

    @Fox Вот так это выглядит.

    Но сообщения в лог не идет о коннекте. Не знаю в чем причина.

    Глянул сейчас сайт, в фаербаге ссылка на рукопожатие выглядит вот так:

    wss://playdrop.org/socket/?EIO=3&transport=websocket&sid=I2OFE0_m89wb2pGHBOeH
    

    и параметр sid берётся из куков

    391ade82-0ee2-4c33-a59e-9fb8aa413471-изображение.png

    Если указать этот параметр, то рукопожатие происходит корректно:

    5b25c4d6-6f7b-4510-9c7b-fb0c116e80ef-изображение.png



  • @Fox said in Помогите с вебсокет:

    и параметр sid берётся из куков

    У меня вообще исходный код автора работает без проблем

    const WebSocket = require('ws');
     
    
    await (new Promise((resolve, reject) => {
        const ws = new WebSocket('wss://playdrop.org/socket/?EIO=3&transport=websocket', {
        origin: 'https://playdrop.org'
        });
        
        ws.on('open', function open() {
        console.log('connected');
        ws.send(Date.now());
        });
        
        ws.on('close', function close() {
        console.log('disconnected');
        	resolve()
        });
        
        ws.on('message', function incoming(data) {
        console.log(data);
        
        setTimeout(function timeout() {
            ws.send(Date.now());
        }, 500);
        });
    }));
    

    2020-08-03_152539.png



  • @UserTrue said in Помогите с вебсокет:

    @Fox said in Помогите с вебсокет:

    и параметр sid берётся из куков

    У меня вообще исходный код автора работает без проблем

    const WebSocket = require('ws');
     
    
    await (new Promise((resolve, reject) => {
        const ws = new WebSocket('wss://playdrop.org/socket/?EIO=3&transport=websocket', {
        origin: 'https://playdrop.org'
        });
        
        ws.on('open', function open() {
        console.log('connected');
        ws.send(Date.now());
        });
        
        ws.on('close', function close() {
        console.log('disconnected');
        	resolve()
        });
        
        ws.on('message', function incoming(data) {
        console.log(data);
        
        setTimeout(function timeout() {
            ws.send(Date.now());
        }, 500);
        });
    }));
    

    Хмм, этот код у меня тоже отработал без проблем. Я его и не проверял, раз автор сказал, что не работает :D



  • @Fox said in Помогите с вебсокет:

    Хмм, этот код у меня тоже отработал без проблем. Я его и не проверял, раз автор сказал, что не работает :D

    У автора скрин обрезан, возможно его код подключается в дочернем модуле. А как "Мы" знаем, если модуль является 3-им и более потомком, то лог БАСа надо пробрасываться самому ))



  • @UserTrue Спасибо большое, что подправили мой код.
    Но сейчас возникает вопрос, как сделать бесперебойное получение данных, чтобы не было таймаута.

    5e198355-0aa6-4587-8aec-23f89eb124c5-image.png



  • @fOrest94 said in Помогите с вебсокет:

    @UserTrue Спасибо большое, что подправили мой код.
    Но сейчас возникает вопрос, как сделать бесперебойное получение данных, чтобы не было таймаута.

    Сохраняйте данные в глобальной переменной, например в массиве и получайте из него данные когда необходимо



  • @Fox С сохранением понятно. Но как реализировать продолжение работы после таймаута?



  • @fOrest94 said in Помогите с вебсокет:

    @Fox С сохранением понятно. Но как реализировать продолжение работы после таймаута?

    а для чего вам вообще таймаут? ))) переместите resolve после конекта и всё. Действие закроется сразу после конекта, а данные вы будете получать в других действиях node обращаясь к глобальной переменной ноды



  • @fOrest94 уберите тогда вообще синхронизацию и пишите результат в глобальную переменную ноды, а в другом месте просто смотрите если в ней данные



  • @UserTrue А может скрипт бесперебойно работать без ошибкы "Таймаут во время выполнения функции на встроенном языке"?



  • @fOrest94 said in Помогите с вебсокет:

    @UserTrue А может скрипт бесперебойно работать без ошибкы "Таймаут во время выполнения функции на встроенном языке"?

    Может, вам же об этом и говорят



  • @Fox Понял. Спасибо большое за подсказки!



  • Возник сейчас вопрос по этой теме: Как сделать, что не было disconnected и данные с вебсокета можна було получать бесконечно?



  • @fOrest94 said in Помогите с вебсокет:

    Возник сейчас вопрос по этой теме: Как сделать, что не было disconnected и данные с вебсокета можна було получать бесконечно?

    Повесить на данное событие обработчик и конектиться заново.


Log in to reply