Я уже некоторое время смотрю на 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 !?