Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何使用UDP端口监听我的Flask web服务器,线程问题_Multithreading_Sockets_Flask_Multiprocessing_Flask Socketio - Fatal编程技术网

Multithreading 如何使用UDP端口监听我的Flask web服务器,线程问题

Multithreading 如何使用UDP端口监听我的Flask web服务器,线程问题,multithreading,sockets,flask,multiprocessing,flask-socketio,Multithreading,Sockets,Flask,Multiprocessing,Flask Socketio,问题就在这里。我已连接带有socketio模块的简单Flask web服务器。在客户端有一些容器,它使用js脚本从服务器获取消息并在浏览器中实时显示。在服务器端,我需要监听其他UDP端口以接收消息,并将接收到的消息传输到客户端浏览器。当我使用BackgroundScheduler()生成定期测试消息时,它工作正常。现在,我将端口侦听器添加到在另一个线程中执行的web服务器,它不会传输消息。它监听UDP端口,它可以将收到的消息打印到python控制台,它还像以前一样提供html页面,但是消息不会从

问题就在这里。我已连接带有socketio模块的简单Flask web服务器。在客户端有一些容器,它使用js脚本从服务器获取消息并在浏览器中实时显示。在服务器端,我需要监听其他UDP端口以接收消息,并将接收到的消息传输到客户端浏览器。当我使用BackgroundScheduler()生成定期测试消息时,它工作正常。现在,我将端口侦听器添加到在另一个线程中执行的web服务器,它不会传输消息。它监听UDP端口,它可以将收到的消息打印到python控制台,它还像以前一样提供html页面,但是消息不会从线程返回到Flask应用程序。我曾尝试使用多处理,将端口侦听器添加到一个单独的进程中,但没有成功。它不调用任何异常,只是什么也不做。我怎样才能找到问题的解决办法

class TestUdp(BaseRequestHandler):

    def handle(self):
        data = self.request[0].strip()
        socket = self.request[1]
        if data:
            socketio.send(data.decode('utf-8')
        socket.sendto(data.upper(), self.client_address)


def run():
    HOST, PORT = "127.0.0.1", 7030
    with UDPServer((HOST, PORT), TestUdp) as server:
        server.serve_forever()
此函数插入到我的烧瓶路径:

@app.route('/')
@app.route('/index')
@login_required
def index():

    t1=Thread(target=run,daemon=True)

    return render_template('main.html')

来自html的js代码:

document.addEventListener('DOMContentLoaded', () => {
    var socket = io.connect('http://' + document.domain + ':' + location.port);
    socket.on('connect', () => {
        socket.send('I\'m connected!');
    });
    socket.on('message', data => {
        console.log(`${data}`)
    });
    socket.on('message', data => {
        const p = document.createElement('li');
//        const br = document.createElement('br');
        p.innerHTML ="<li>"+ data + "</li>" ;
//        document.querySelector('#message').append(p);
         var resultList = document.getElementById('resultList');
            resultList.append(p);
    });
})

document.addEventListener('DOMContentLoaded',()=>{
var socket=io.connect('http://'+document.domain+':'+location.port);
socket.on('connect',()=>{
send('I'm connected!');
});
socket.on('message',data=>{
console.log(`${data}`)
});
socket.on('message',data=>{
const p=document.createElement('li');
//const br=document.createElement('br');
p、 innerHTML=“
  • ”+数据+”
  • ”; //document.querySelector(“#message”).append(p); var resultList=document.getElementById('resultList'); 结果列表追加(p); }); })
    每次客户端检索
    /index
    时,flask服务器都会启动一个新线程。这些线程中的每一个都试图在相同的地址启动服务器。这可能不是问题的原因,但可能不是正确的设置。您的代码有语法错误。看看handle方法中的socketio.send调用,它缺少一个右括号。另外,您是否在Socket.IO服务器中使用eventlet或gevent?如果是,那么就不能从单独的线程发出,线程本质上与eventlet/gevent不兼容,您可以使用greenlet或monkey补丁来实现。