【问题标题】:How to run a python Flask and TCP server in same app如何在同一个应用程序中运行 python Flask 和 TCP 服务器
【发布时间】: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


【解决方案1】:

尝试改变:

app.run(debug=True)
t = threading.Thread(target=launchServer)
t.daemon = True
t.start()

收件人:

t = threading.Thread(target=launchServer)
t.daemon = True
t.start()
app.run(debug=True)

这样服务器才能真正在另一个线程上启动。

【讨论】:

  • 你可能还需要:app.run(debug=True, use_reloader=False)
【解决方案2】:

'127.0.0.1' 表示本地计算机。客户端应用程序连接到自身,而不是服务器。你需要服务器的IP。参考这个:

Python ConnectionRefusedError: [Errno 61] Connection refused

在 index() 中也使用了变量“conn”,但它在 launchServer() 中被实例化。这不起作用,因为它超出了范围。

【讨论】:

    【解决方案3】:

    在flask网站上搭建一个RESTfuul API,其他程序可以很方便的和http通信。例如,python 对此有 requests 库。这是一种更简单的方法。

    【讨论】:

    • 我将使用 Python 和 Flask 制作应用程序,所以我的问题是如何在不阻塞 Flask 的情况下运行 TCP 服务器,反之亦然。 Socket 是一种可能,因为 Websocket 有 Flask 扩展,但它们似乎与 Python 3 不兼容,而且我们 99% 都在 Python 3 中工作,因此宁愿避免也必须管理 Python 2.7。
    • @elburzs 好的。然后只需为 Flask 和 TCP 服务器使用不同的端口。
    • 你确定这会起作用吗?你以前做过吗?据我了解,TCP 服务器在监听数据时会阻塞,所以一旦我建立连接并监听来自另一端的数据,我的 Flask 应用程序就会被阻塞。我错了吗?
    • 我不确定你是否理解我的问题......我的意思是进程阻塞,而不是端口被阻塞......stackoverflow.com/questions/9770567/…
    • @elburzs 好的,你能改一下你的问题吗?有多少台机器?有多少个过程?为什么它们会互相屏蔽?
    猜你喜欢
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2018-07-19
    • 2021-08-12
    相关资源
    最近更新 更多