Javascript 是否可以在不丢失前一个套接字的情况下,从单个客户机建立多个套接字io连接
我一直在学斯克塞蒂奥。其目的是使用在局域网中工作的socket io制作一个类似p2p(不应该正确地说)的聊天应用程序。所有用户都有大家都知道的静态IP地址。局域网中有4个设备。每个人都将在自己的系统中安装flask应用程序。这是app.py和chat.html(JS中的客户端) 这是app.py的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
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
。因此,2io.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)连接到该服务器。