Я пытаюсь развернуть сервер сокетов Python на Heroku, но кажется, что соединение с сокетами сделано неправильно ... В моем случае, метод accept()
должен подождать, пока будет установлено сокетное соединение, но кажется, что он срабатывает, даже если я не запускаю свой client.py
скрипт ...
Кроме того, при запуске клиента соединение действительно установлено, но сервер не получает и не отправляет данные ...
Что я делаю не так? Все это работает локально ... (изменяя порт с 80 на 12345 и адрес на localhost) ...
Вот что у меня есть:
# server.py
import socket
import os
server = socket.socket()
port = int(os.environ.get("PORT", 12345))
server.bind(("0.0.0.0", port))
server.listen(5)
# should wait for an actual connection, but fires right away
s, _ = server.accept()
# should wait to receive "Hello, world! (from client)", but receives b''
s.recv(1024)
s.send("Hello, world! (from server)".encode())
s.close()
# client.py
import socket
s = socket.socket()
print("connecting to server...")
# "...my-heroku-app.." changed to the actual heroku app url
s.connect(("my-heroku-app.herokuapp.com", 80))
print("sending data...")
s.send("Hello, world! (from client)".encode())
print("receiving data...")
# should receive "Hello, world! (from server)",
# but blocks because the server already stopped
print(s.recv(1024).decode())
s.close()
# Procfile
web: python server.py
Я также пытался поместить s.recv()
в цикл до тех пор, пока полученные данные не будут равны None, а просто зацикливаются навсегда ... (на стороне сервера)
Что я здесь не так делаю? Правильно ли привязан сервер (адрес и порт)? Heroku поддерживает такой сервер? Кажется, я не нашел никакой информации о том, как это сделать (есть только примеры использования Flask и других фреймворков веб-серверов ...).
EDIT
После некоторой регистрации кажется, что 172.18.17.53
- это IP-адрес, который всегда подключается к серверу и поддерживает его занятость. Также кажется, что этот IP-адрес недоступен, потому что функциональные блоки send () ...
Я пытался добавить s.settimeout(0.05)
, но он ничего не изменил для метода send()
...