Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.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
Javascript 是否可以在不丢失前一个套接字的情况下,从单个客户机建立多个套接字io连接_Javascript_Sockets_Socket.io_Flask Socketio - Fatal编程技术网

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

Javascript 是否可以在不丢失前一个套接字的情况下,从单个客户机建立多个套接字io连接,javascript,sockets,socket.io,flask-socketio,Javascript,Sockets,Socket.io,Flask Socketio,我一直在学斯克塞蒂奥。其目的是使用在局域网中工作的socket io制作一个类似p2p(不应该正确地说)的聊天应用程序。所有用户都有大家都知道的静态IP地址。局域网中有4个设备。每个人都将在自己的系统中安装flask应用程序。这是app.py和chat.html(JS中的客户端) 这是app.py的 from flask import Flask,render_template,request,url_for,redirect from flask_socketio import SocketI

我一直在学斯克塞蒂奥。其目的是使用在局域网中工作的socket io制作一个类似p2p(不应该正确地说)的聊天应用程序。所有用户都有大家都知道的静态IP地址。局域网中有4个设备。每个人都将在自己的系统中安装flask应用程序。这是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)
以及
模板/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>

开始聊天
让我们开始聊天室{{room}
发送
常量套接字=io.connect(“http://192.168.1.2:5000");
socket.on('connect',function(){
插座。发射(‘连接房间’{
用户名:“{{username}}”,
房间:“{{room}}”
})
});
socket.on('join\u room\u announce',函数(数据){
警报(data.username);
})
这是直的。Alice正在她的系统中运行app.py并试图连接到Bob(192.168.1.2:5000)。当Bob在他的系统和局域网内运行app.py时,Alice接通了连接。 在Alice和Bob进入同一个房间后,Bob可以在浏览器中看到弹出的“Alice”

这很好。但是如果爱丽丝也想和弗兰克联系呢(192.168.1.3:5000)?Alice如何在客户端、服务器端修改她的socketio连接,使之成为可能。我已尝试在chat.html中添加另一个
io.connect
。因此,2
io.connect
功能仅第一个
io.connect()
工作

如果直截了当的回答是“这在socketio中是不可能的”,是否有一些调整使之成为可能?最终,爱丽丝可以与鲍勃、弗兰克或其他许多人建立联系,其他成员也可以建立联系。基本上,一个人应该能够与多个人联系

这在类似WebRTC的协议中是可能的。但是,这不是我们想要的。我希望有一些调整,使这可能与套接字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);
    })

app.py中是否需要进行任何更改?还有,如果我们想扩大规模呢。这意味着我们必须与更多的客户打交道。在这一点上,代码会变大。你不必在app.py中更改任何内容。因为它将在一个新连接上创建一个新实例。您希望从一个客户端进行多个套接字连接的场景是什么?flask应用程序具有LAN中成员的所有用户ID和IP地址的命令。假设LAN和Alice中有10个成员想要聊天,那么就说5个成员。Alice搜索他们的用户名并从字典中获取ip地址。因此,Alice需要多个套接字连接,而不会丢失以前的聊天记录。Alice搜索用户James,查找python字典,获取ip地址,使用我们拥有的js客户端(chat.html)连接到该服务器。