- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我是 Redis 发布/订阅的新手,所以请多多包涵。我正在尝试创建一个 IRC,用户可以在其中创建自己的聊天室,有点像 Gitter。以下是我到目前为止所做的。我通过用户名将用户订阅到不同的 channel 只是为了测试。事情是当我发布到 channel x 时,订阅到 channel y 的客户仍然得到相同的消息..我正在使用 redis-cli 和 PUBLISH 命令发布。
function handleIO(socket){
function disconnect(){
console.log("Client disconnected");
socket.broadcast.emit("user d/c", socket.username+" has left!");
}
socket.on("new user", function(username){
socket.username = username;
if(socket.username == "chat"){
redisClient.subscribe("chat");
}else{
redisClient.subscribe("other");
}
socket.userColor = '#'+(Math.random()*0xFFFFFF<<0).toString(16);
socket.emit("new_user", username);
emitter.lrange("messages", 0, -1, function(err, messages){
//reversing to be in correct order
messages = messages.reverse();
messages.forEach(function(message){
message = JSON.parse(message);
socket.emit("messages", message);
});
});
socket.broadcast.emit("user connection", username+" has connected to the Haven!");
});
socket.on("disconnect", disconnect);
socket.on("send", function(msg){
var msg = JSON.stringify( { name: socket.username, messageText: msg, color: socket.userColor } );
emitter.lpush("messages", msg, function(err, response){
//keep newest 10 items
emitter.ltrim("messages", 0, 9);
});
io.sockets.emit("receive", msg, socket.userColor);
});
redisClient.on("message", function (channel, message) {
console.log(channel+":"+message);
socket.emit("message", channel, message);
});
}
最佳答案
对于那里迷路的流浪者...我所做的是在客户端上实现另一个事件,基本上检查该客户端是否“有权”接收消息(即,如果消息的 channel 是否属于客户端的子 channel 列表,则那讲得通)。
客户端
socket.on("message", function(channel, message){
socket.emit("entitled", channel, message);
});
socket.on("entitled", function(reply, channel, message){
if(reply == 1){
$("#msgArea").append(message+"<br/>");
$("#msgArea").prop({ scrollTop: $("#msgArea").prop("scrollHeight") });
}
});
服务器端
socket.on("entitled", function(channel, message){
//check that user is subbed
emitter.sismember('channels:'+socket.username, channel, function(err, reply){
if(err) throw err;
socket.emit("entitled", reply, channel, message);
});
});
我故意遗漏的是,我没有继续使用 socket.username,而是开始使用 session 来保持持久性。我的建议是坚持使用 redis 存储,因为它是 github 上最受欢迎的存储之一。
关于node.js - Redis Pub/Sub 聊天室,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33223678/
Rust 支持 pub和 pub(super) . pub使父模块可以访问项目...和pub(super)似乎也做同样的事情。我试过玩下面的例子,并交换 pub和 pub(super)似乎没有效果:
我正在尝试运行 this拖放 API。当我尝试运行 dart 文件(使用 dart 编辑器)时,出现以下错误: could not start pub serve or connect to pub
根据pub get docs pub get 和 pub Upgrade 之间的主要区别是: If a lockfile already exists, pub get uses the versio
我see函数的可见性可以在模块内声明为 pub(self)。这与没有 pub 属性的私有(private)函数有何不同?如果它们没有区别,为什么会存在这种语法? 最佳答案 pub(restricted
我正在运行 pub install 以便我可以使用作为 dart sdk 一部分的 intl 包(我需要使用 DateFormat 类)。我已经在我的项目中安装了其他包,例如 XML 解析器和演示文稿
假设我在 Rust 包中有这个文件层次结构: src/... src/m1/mod.rs src/m1/path/m2.rs 拥有以下行的实际区别是什么: pub mod path::m2; 在我的文
其中一个比另一个更安全吗? 最佳答案 id_rsa.pub 和 id_dsa.pub 是 id_rsa 和 id_dsa 的公钥。 如果您询问与 SSH 相关的问题,id_rsa 是 RSA key
pub 是 Dart 的包管理器。 Flutter 是一个使用 Dart 的移动应用 SDK。如何创建依赖于或以 Flutter 为目标的包? 最佳答案 要从 pub 包中声明对 Flutter 的依
id_rsa.pub 文件基本上是 Linux 主文件夹下 .ssh 文件夹中的一些加密文本,用于公钥加密。它使用 .pub 文件格式。但为什么这种文件格式也恰好是 Microsoft Publish
使用当前版本的angular.dart.tutorial , 使用 Chapter_04 对于“pub serve”,main.dart.js 是一个 42337 行的文件,示例运行良好。 对于“pu
假设我正在运行我自己的 pub-dartlang 实例对于私有(private)酒吧供稿;如何在 pubspec.yaml 中注明哪些软件包来自私有(private)提要与 pub.dartlang.
我们通过运行脚本来实现DART自动化,该脚本导航到项目文件夹(.yaml文件所在的位置)并运行“pub get”和“pub build”。它工作了一段时间,但现在(两种情况下)我们都得到了: Unha
我刚刚安装了 Dart Editor 并创建了一个简单的 Web 应用程序,当我单击运行时它显示此错误并且没有任何 react 。 “无法启动 pub 服务或连接到 pub” dart editor
当我尝试在 android studio 中打开大部分已下载的 flutter 应用程序时,它一直告诉我“Pub get”尚未运行,当我按下“获取依赖项”或升级依赖项时,它会向我显示该错误。我已经把a
在哪里可以找到用于搜索和列出已安装的打包版本和可用升级版本的命令行工具? 我想不出任何其他的软件包管理工具,它们不包含列出已安装版本或查找可用升级的命令,而无需实际升级。 例如,如果我的pubspec
前两天升级到 Flutter 2.0 开始面对 Execution failed for task ':app:compileFlutterBuildDebug'由于一些包裹。 然后我降级了,但错误仍
下面提供了相关的程序代码。我经常在开源项目中看到这样的代码,可以在Linux和Windows上运行。有人告诉我,这是为了避免编译警告。真的是这样吗? class Base { public:
我有一个带有简单测试代码的函数,例如: exports.helloPubSub = (event, context) => { const message = event.data
无法解析 URL“https://pub.dartlang.org”。错误 (69):无法“发布升级”flutter 工具。五秒后重试...(还剩 9 次尝试) 这是我创建或升级flutter时flu
我正在尝试制作一个脚本来控制农场中的 Android 设备,adb connect 通过 OpenSTF 建立连接。 .设备接受来自客户端的连接的要求之一是在 OpenSTF 中提供 adbkey.p
我是一名优秀的程序员,十分优秀!