是否可以在不丢失先前套接字的情况下从单个客户端建立多个套接字 io 连接

Is it possible to have multiple socket-io connections from a single client without loosing previous socket

我一直在学习 flask-socketio。目的是使用在 LAN 中工作的 socket-io 制作类似 p2p(不应该正确地说)的聊天应用程序。所有用户都有众所周知的静态IP地址。 LAN 中有 4 台设备。每个人都将在自己的系统中安装 flask-app。这是 app.py 和 chat.html(JS 中的客户端)

这是app.py

from flask import Flask,render_template,request,url_for,redirect
from flask_socketio import SocketIO,join_room

app = Flask(__name__)
socketio = SocketIO(app,cors_allowed_origins="*")
app.config['SECRET_KEY'] = 'mysecret'

@app.route('/')
def hello_world():
    return render_template('index.html')

@app.route('/chat')
def chat():
    username = request.args.get('username')
    room    = request.args.get('room')

    if username and room:
        return render_template('chat.html',username=username,room=room)
    else:
        return redirect(url_for('home'))
        
@socketio.on('join_room')
def joinchannel(data):
    app.logger.info("{} is ONLINE NOW!".format(data['username']))
    join_room(data['room'])
    socketio.emit('join_room_announce',data)


if __name__ == '__main__':
    socketio.run(app, host='0.0.0.0', port=5000,debug=True)

templates/chat.html

    <!DOCTYPE html>
<html>
<head>
    <title>START CHAT</title>
</head>
<body>

<h1>lets start the chat room {{ room }}</h1>
<div id="messages"></div>

<form>
    
    <input type="text" placeholder="enter message">
    <button type="submit">send</button>
</form> 
</body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"></script>
<script>
    const socket = io.connect("http://192.168.1.2:5000");
    socket.on('connect',function() {
        socket.emit('join_room',{
        username: "{{ username }}",
        room: "{{ room }}"
    })
});
    socket.on('join_room_announce', function (data) {
        alert(data.username);
    })
</script>
</html>

这是直的。 Alice 在她的系统中 运行 app.py 并尝试连接到 Bob (192.168.1.2:5000)。当鲍勃在他的系统和局域网内运行 app.py 时,爱丽丝连接上了。 在 Alice 加入与 Bob 相同的房间后,Bob 能够在他的浏览器中看到“Alice”作为弹出窗口。

这很好。但是,如果爱丽丝也想连接弗兰克 (192.168.1.3:5000) 怎么办? Alice 如何在客户端、服务器端修改她的 socketio 连接以使其成为可能。我尝试在 chat.html 中添加另一个 io.connect。因此 2 io.connect 函数并且只有第一个 io.connect() 起作用。

如果直接的答案是“这在 socketio 中是不可能的”,是否有一些调整使其成为可能?最终 Alice 可以连接到 Bob、Frank 或许多其他成员也可以有相同的。基本上,一个人应该可以联系到多个人。

这可以通过类似 WebRTC 的协议实现。但是,这不是我们想要的。我希望有一些调整可以使 socket-io 成为可能。 感谢阅读!

是的,你可以。你只需要将它们放在不同的变量中。

const socketConnectionOne = io.connect("http://192.168.1.2:5000");

socketConnectionOne.on('connect',function() {
        socket.emit('join_room',{
        username: "{{ username }}",
        room: "{{ room }}"
    })
});

socketConnectionOne.on('join_room_announce', function (data) {
        alert(data.username);
    })

const socketConnectionTwo = io.connect("http://192.168.1.2:5000");

socketConnectionTwo.on('connect',function() {
        socket.emit('join_room',{
        username: "{{ username }}",
        room: "{{ room }}"
    })
});

socketConnectionTwo.on('join_room_announce', function (data) {
        alert(data.username);
    })