如何在同一个应用程序中运行 python Flask 和 TCP 服务器

5 python flask python-3.x

在下面的代码中,我相信我能够让 TCP 服务器与 Flask 应用程序一起运行,但是当我运行仅连接和侦听的测试客户端应用程序时,我收到“ConnectionRefusedError 61”。

如果我让 Flask 应用程序运行,然后单击我的表单按钮之一,我也会收到错误,提示“conn 未定义”。

最终目标:拥有一个 Flask 应用程序,可以通过 TCP 或 Websockets 向网络上的另一台计算机发送消息。我首先尝试 TCP 的原因首先是与 Websockets 相比比较熟悉,其次我找不到与 Python 3 兼容的 Flask 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()
Run Code Online (Sandbox Code Playgroud)

客户端应用程序:

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()
Run Code Online (Sandbox Code Playgroud)

Men*_*ang 0

在flask网站上构建一个RESTfuul API,其他程序就可以轻松地进行http通信。例如,python 有requests这样的库。这是一个更简单的方法。