首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >烧瓶.多个连接后的插孔

烧瓶.多个连接后的插孔
EN

Stack Overflow用户
提问于 2020-05-17 12:26:36
回答 1查看 1.4K关注 0票数 0

我在python中使用flask-socketio创建了一个小型应用程序,在reactjs中使用了客户机。

这个应用程序在不同的浏览器选项卡中同时打开3-4连接,运行得非常好。但是,当我再添加一个连接到它时,它就会被卡住。

我也安装了eventletgevent-websoket

server.py

代码语言:javascript
复制
from flask import Flask
from flask_cors import CORS
from flask_socketio import SocketIO, join_room

app = Flask(__name__)
app.config['SECRET_KEY'] = 'xyz'
socketio = SocketIO(app)
CORS(app)

@socketio.on('login')
def on_login(data):
    room_id_ = data['roomId']
    join_room(room_id_)
    username_ = data['username']
    print('user ' + username_ + ' connected to the room: ' + room_id_)
    socketio.emit('loggedIn', username_, room=room_id_)

if __name__ == '__main__':
    socketio.run(app)

下面是react中的客户端代码实现。

App.js

代码语言:javascript
复制
import React, {Component} from 'react';
import io from 'socket.io-client'

const socket = io('http://localhost:5000')

class App extends Component {
    constructor(props) {
        super(props);
        this.logInUser = this.logInUser.bind(this);
        this.state = {
            username: 'abc',
            roomId: '1234'
        }  
    }

    logInUser = () => {
            socket.emit('login', {username: this.state.username, roomId: this.state.roomId});
    }

    setSocketListeners() {
        socket.on('loggedIn', (data) => {
            console.log(data)
        });
    }

        render() {
    return (
        <React.Fragment>
            <div className="container-fluid">
                {this.state.username}
            </div>
        </React.Fragment>
        );
    }
}

pip冻结输出

代码语言:javascript
复制
cffi==1.14.0
click==7.1.2
dnspython==1.16.0
eventlet==0.25.2
Flask==1.1.2
Flask-Cors==3.0.8
Flask-SocketIO==4.3.0
gevent-websocket==0.10.1
greenlet==0.4.15
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
monotonic==1.5
pycparser==2.20
python-engineio==3.12.1
python-socketio==4.5.1
six==1.14.0
Unidecode==1.1.1
Werkzeug==1.0.1

当我打开第五个选项卡时,工具输出。您可以看到响应花费了21秒钟以上,并且400段代码中很少有请求失败。

我正在用socketio.run(app)运行这个应用程序。

我以为是因为long-polling,所以性能下降了。所以我尝试在客户端代码中启用websocket而不是long-polling

代码语言:javascript
复制
const socket = io('ws://localhost:5000', {transports: ['websocket']});

我在镀铬控制台中发现了400错误:

代码语言:javascript
复制
websocket.js:120 WebSocket connection to 'ws://localhost:5000/socket.io/?EIO=3&transport=websocket' failed: Error during WebSocket handshake: Unexpected response code: 400
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-18 17:13:34

这是CORS问题,在启用websocket时拒绝客户端连接。

下面是我为允许crossed_origins而添加的配置:

代码语言:javascript
复制
socketio = SocketIO(app, cors_allowed_origins=[], logger=True, engineio_logger=True)

此外,通过启用websockets,性能也得到了改善。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61851776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档