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