gpt4 book ai didi

javascript - 使用node.js通过链接创建私有(private)房间

转载 作者:行者123 更新时间:2023-12-03 01:31:44 25 4
gpt4 key购买 nike

我已阅读此内容:

https://socket.io/docs/rooms-and-namespaces/#

private chat with socket.io

我想做的是进行公开聊天:

“/”

以及/xyz 上的私有(private)聊天,使用此 URL 的每个人都可以在其中交谈。

我将生成随机链接并稍后弄清楚它们,但首先我需要弄清楚如何将公共(public)用户和私有(private)用户连接到不同的套接字?特别是因为他们在做同样的事情,我根本不知道如何有效地做到这一点。

所以首先我必须使用以下方法捕获服务器/私有(private) URL:

app.get("/private",function(req,res){
res.render("page");
console.log("Rendered private page"); });

我首先想到的解决方案是使用自定义命名空间。

    var namespace = io.of('/private');
namespace.on('connection',function(socket){
console.log('someone connected to private');
socket.emit('pmessage',{message:'Connected to a private chat!'});

});

但这成为我的前端的一个问题(我不知道如何操作,因为我对此很陌生)。我基本上会使用重复的代码来处理相同的事情,只是针对不同的用户子集。

所以这个:

    var socket = io.connect('127.0.0.1:8090');

我需要添加一个新的套接字,对吧:

    var private = io.connect('127.0.0.1:8090/private');

那么我是否只需复制所有内容?我知道这可能不是正确的解决方案。但我不知道该向哪里求助。基本上将所有内容都用于私有(private)而不是套接字

socket.on('message',function(data){
//Type out the message in the htmlTextField into the htmlChatContent if message was received
//Keep the other chats
if(data.message){
//From w3c:The push() method adds new items to the end of an array, and returns the new length.
//Example: ["hi","hello"] ---push("wazzzaaap")--->["hi","hello","wazzzaaap"]
messages.push(data);
//put messages into the HTML code
var html = '';
console.log("Currently in messages" + data.message);
console.log(data.username);
for(var i = 0;i<messages.length ;i++){
//Put it into a string and add a HTML defined symbol sequence for a line break
//Add username in front of it in bold
//FIXME: Currently only able to get messages[i] which is just the content
if(messages[i].username==null){
html+=messages[i].message + '<br />';
}
else{
html+='<b>'+ messages[i].username + ': </b>' + messages[i].message + '<br />';

}

}
//Add the message formatted into HTML into the chat content box
htmlChatContent.innerHTML = html;
//When sending clear the input field also

htmlTextField.value = "";
}
else{
//This means there was an error
//Put error text inside the users text box
console.log("Error");
htmlTextField.innerHTML = "There was an sending error!";
}
});

我希望获得有关如何处理随机生成的链接的指导,我的想法是:

创建链接的数据库,在最后一个人离开时删除条目。但是如何编写动态链接呢?我不能硬编码 500 个不同的选项,对吧?

我是否需要添加更多代码才能使问题变得更好?

最佳答案

I'll get to generating random links and figuring them out later, but first I need to figure out how to connect public users and private users to different sockets?

不,您在客户端和服务器之间需要一个套接字。然后,您可以将数据从服务器发送到某些套接字。 Socket.io 为此提供了空间,这基本上意味着您可以按组管理套接字,并且可以轻松地将数据发送到该组中的套接字。

I can't hardcode 500 different [sockets / links], right?

不,那太过分了。只需让客户端/服务器生成随机 url 即可。为了使它们独一无二,您只需获取时间戳并添加一个随机数即可:

 const id = "" + Math.floor(Math.random() * 1000) + Date.now();

现在,如果您想管理/验证 http 服务器上的客户端,您可以使用动态 url,例如:

 yourserver/private/1272271737

使用 express 很容易将它们全部捕获:

 app.get("/private/:id", (req, res) => {
const { id } = req params;
// Verify the id and return the clientside code
});

但实际上只有套接字服务器需要知道房间ID,所以你可以使用所谓的“hashbang urls”,它们看起来像:

 yourserver/private#127272

在服务器端,客户端访问 /private 时看起来就像这样,您只需返回应用程序即可:

 app.get("/private", (req, res) => /*...*/);

但在客户端,您可以获得 id:

 const id = location.hash;

现在客户端可以加入相关房间了:

socket.join(id);

现在发送消息时只需发送房间 ID:

 socket.emit("msg", id, "Hi!");

在服务器上,您只需将其广播到该房间即可:

io.on('connection', (socket) => {
socket.on("msg", (id, msg) => {
io.to(id).emit("msg", msg);
});
});

关于javascript - 使用node.js通过链接创建私有(private)房间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51266723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com