【发布时间】:2015-02-14 18:17:17
【问题描述】:
在下面的代码中,我相信我能够让 TCP 服务器与 Flask 应用程序一起运行,但是当我运行一个仅连接和侦听的测试客户端应用程序时,我得到了“ConnectionRefusedError 61”。
如果我让烧瓶应用程序运行,然后单击我的表单按钮之一,我也会收到错误消息,说“未定义 conn”。
最终目标:拥有一个可以使用 TCP 或 Websocket 向我们网络上的另一台计算机发送消息的 Flask 应用程序。我首先尝试 TCP 的原因首先是与 Websockets 相比熟悉,其次我找不到兼容 Python 3 的烧瓶 Websockets 框架,我们所做的一切都是在 Python 3 中,所以如果我可以避免管理 2 个版本Python,这将是一件少考虑的事情。我愿意接受其他建议。
客户端和服务器代码如下:
服务器:
from flask import Flask, render_template, request
import random, socket, threading
#tcp server
TCP_IP = '127.0.0.1'
TCP_PORT = 7005
BUFFER_SIZE = 20
def launchServer():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)
print('waiting for connection')
conn, addr = s.accept()
print ('Connection address:', addr)
#flask app
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
if request.form['submit'] == 'button1':
conn.send(b'button1')
return "Random number between 1 and 10: " + str(random.randint(1,10))
elif request.form['submit'] == 'button2':
conn.send(b'button1')
return "Random number between 11 and 1000: " + str(random.randint(11,1000))
else:
pass
if request.method == 'GET':
return '''
<title>What would you like to do?</title>
<form action="" method="post">
<br><br>
<input type="submit" name="submit" value="button1">
<br><br>
<input type="submit" name="submit" value="button2">
</form>
'''
if __name__ == "__main__":
app.run(debug=True)
t = threading.Thread(target=launchServer)
t.daemon = True
t.start()
客户端应用:
import socket
TCP_IP = '127.0.0.1'
TCP_PORT = 7004
BUFFER_SIZE = 20
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
while 1:
data = s.recv(BUFFER_SIZE)
if not data: break
print ('received data: ', data)
s.close()
【问题讨论】:
-
但无论如何,将它们分开运行并让它们通过数据库或其他方式进行通信。据我所知芹菜; celery 队列也会被 TCP 服务器阻塞。除非您不需要其他任何队列,否则您将需要运行两个 celery 实例。
-
@user3126264 你找到解决办法了吗?
标签: python python-3.x flask