Python socketIO_client подключиться к приложению Heroku (отлично работает в localhost) - PullRequest
0 голосов
/ 29 ноября 2018

Я уже некоторое время смотрю на Google и эти форумы, но не могу найти решение ...

Мне удалось создать приложение socket.io, которое работаетна Heroku (да!), и все работает отлично, я не думаю, что мне нужно публиковать исходный код в реальном приложении, потому что он отлично работает на нескольких компьютерах и т. д ...., он просто настроен стандартным способомсоздание приложения socket.io с помощью node.js, и оно работает нормально ...

Проблема: Я пытаюсь подключиться к этому приложению с помощью Python, локально на клиентском компьютере.side.

Для этого я попытался использовать простую библиотеку socketIO_client, но у меня возникли некоторые проблемы с ней просто из-за их документов, поэтому на этих форумах я нашел следующий код и поместил его в собственный пакет.:

import logging
import socketIO_client
from socketIO_client.transports import get_response
from socketIO_client.parsers import get_byte, _read_packet_text, parse_packet_text

from requests.exceptions import ConnectionError
def _new_read_packet_length(content, content_index):
    packet_length_string = ''
    while get_byte(content, content_index) != ord(':'):
        byte = get_byte(content, content_index)
        packet_length_string += chr(byte)
        content_index += 1
    content_index += 1
    try:
        return content_index, int(packet_length_string)
    except Exception as ok:
        print ok

def new_decode_engineIO_content(content):
    content_index = 0
    content_length = len(content)
    while content_index < content_length:
        try:
            content_index, packet_length = _new_read_packet_length(
                content, content_index)
        except IndexError:
            break
        content_index, packet_text = _read_packet_text(
            content, content_index, packet_length)
        engineIO_packet_type, engineIO_packet_data = parse_packet_text(
            packet_text)
        yield engineIO_packet_type, engineIO_packet_data

def new_recv_packet(self):
    params = dict(self._params)
    params['t'] = self._get_timestamp()
    response = get_response(
        self.http_session.get,
        self._http_url,
        params=params,
        **self._kw_get)
    for engineIO_packet in new_decode_engineIO_content(response.content):
        engineIO_packet_type, engineIO_packet_data = engineIO_packet
        yield engineIO_packet_type, engineIO_packet_data
def CobSocket(url, port):
    return socketIO_client.SocketIO(url, port)

setattr(socketIO_client.transports.XHR_PollingTransport, 'recv_packet', new_recv_packet)
logging.basicConfig(level=logging.DEBUG)

и затем я использую это в своем основном файле python:

import cobsockit
try:

    socket = cobsockit.CobSocket("insta-menorah.herokuapp.com/", 39203)
    socket.emit('welcome', "a new connection is here")
    socket.wait(seconds=1)

except cobsockit.ConnectionError:
    print "something didn't work out too well"

, чтобы вы могли видеть, что я подключаю URL-адрес приложения heroku к соединению с сокетом (и, кстати,если я просто использую localhost без героку вообще, тоДанный скрипт на самом деле работает, он нормально подключается к серверу сокетов node.js, проблема только в том, что он загружен в Heroku).

Номер порта, полученный при запуске heroku run printenv -a insta-menorah в терминале, как я читаю здесь на форумах.Я также слышал, что если вы обращаетесь к нему извне, вам нужно использовать порт 80, но когда я это получаю, я получаю следующую ошибку в терминале:

Starting new HTTP connection (1): insta-menorah.herokuapp.com:80
DEBUG:urllib3.connectionpool:http://insta-menorah.herokuapp.com:80 "GET //socket.io/?EIO=3&transport=polling&t=1543480624168-0 HTTP/1.1" 200 None
invalid literal for int() with base 10: '<html>\n    <head>\n\n    </head>\n    <body>\n        <script src="/socket.io/socket.io.js"></script>\n        <script>\n        var server = io.connect(window.location.hostname);\n        server.on("dude lo'
Traceback (most recent call last):
  File "socketpython.py", line 8, in <module>
    socket = cobsockit.CobSocket("http://insta-menorah.herokuapp.com/", 80)
  File "/Users/admin/Documents/menorah/cobsockit.py", line 46, in CobSocket
    return socketIO_client.SocketIO(url, port)
  File "/usr/local/lib/python2.7/site-packages/socketIO_client/__init__.py", line 353, in __init__
    resource, hurry_interval_in_seconds, **kw)
  File "/usr/local/lib/python2.7/site-packages/socketIO_client/__init__.py", line 54, in __init__
    self._transport
  File "/usr/local/lib/python2.7/site-packages/socketIO_client/__init__.py", line 62, in _transport
    self._engineIO_session = self._get_engineIO_session()
  File "/usr/local/lib/python2.7/site-packages/socketIO_client/__init__.py", line 76, in _get_engineIO_session
    transport.recv_packet())
  File "/Users/admin/Documents/menorah/cobsockit.py", line 42, in new_recv_packet
    for engineIO_packet in new_decode_engineIO_content(response.content):
  File "/Users/admin/Documents/menorah/cobsockit.py", line 25, in new_decode_engineIO_content
    content, content_index)
TypeError: 'NoneType' object is not iterable

Итак, я даже не получаю никакой ошибкисообщений, но когда я запускаю сценарий, кажется, что он просто зависает навсегда и ничего не делает, вот что я запускаю и на какое-то время он зависает:

python socketpython.py
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): insta-menorah.herokuapp.com:39203

, затем через 10-15 минутили так оно показало это:

WARNING:socketIO-client:insta-menorah.herokuapp.com:39203//socket.io [engine.io waiting for connection] HTTPConnectionPool(host='insta-menorah.herokuapp.com', port=39203): Max retries exceeded with url: //socket.io/?EIO=3&transport=polling&t=1543479369533-0 (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x1027c3a90>: Failed to establish a new connection: [Errno 60] Operation timed out',))

и затем снова начал подключаться ....

SO: Как я могу просто подключиться к приложению Heroku node.js с Python !?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...