我正在尝试将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和其他Web服务器框架的示例...)。
经过一些日志记录后,看来172.18.17.53
是始终连接到服务器并使它保持繁忙状态的IP。似乎该IP也无法访问,因为send()函数会阻止...
我尝试添加s.settimeout(0.05)
,但是对于send()
方法却没有任何改变...