我在c#中有一个事件类:
public class AreaInterventoCreata{
//public properties
}
var message= new AreaInterventoCreata();
我创建了这个类服务器端的实例。我的目标是将此创作传达给已订阅此类事件的客户。
因此我将它传递给我的经纪人RabbitMQ byte[]
:
var responseBody = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message))
responseChannel.BasicPublish(
"", // exchange
properties.ReplyTo, // routingKey
responseProperties, // basicProperties
responseBody); // body
某些node.js服务器已订阅此类消息:
q.subscribe(function (message) {
for (var i = 0; i < sockets.length; i++) {
console.log('_sockets[' + i + '] emitted');
sockets[i].emit(event, message);
}
});
这个node.js自己收到了来自浏览器的socket.io连接,因此可以对这些套接字执行推送,例如这些浏览器:
sockets[i].emit(event, message);
最后,我在浏览器中收到此消息:
var socket = io.connect('http://localhost:8091');
socket.on('Events_AreaIntervento_AreaInterventoCreata:Events', function (data) {
var json = Utf8.decode(data);
});
当我通过firebug检查数据时,它是一个对象数据,其数字数组定义为data.data
。
我假设这个数字数组是我在进程开始时给出的字节数组。这个假设我错了吗?
在这个website
的帮助下找到它(至少是其中的一部分)var Utf8 = {
// public method for url decoding
decodeArray: function (utfArray) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;
while (i < utfArray.length) {
c = utfArray[i];
if (c < 128) {
string += String.fromCharCode(c);
i++;
}
else if ((c > 191) && (c < 224)) {
c2 = utfArray[i + 1];
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
i += 2;
}
else {
c2 = utfArray[i + 1];
c3 = utfArray[i + 2];
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
i += 3;
}
}
return string;
}
}
像这样使用
<script>
var socket = io.connect('http://localhost:8091');
socket.on('Events_AreaIntervento_AreaInterventoCreata:Events', function (msg) {
var jsonString = Utf8.decodeArray(msg.data);
alert(jsonString);
});
</script>
但我仍然想知道在客户端或node.js服务器上执行此操作是否更好,以及如何在node.js服务器上执行此操作?
答案 0 :(得分:0)
我之前从未使用过RabbitMQ,但看起来你将JSON字符串从.NET传递给RabbitMQ的方式有问题。您的“responseProperties”可能不正确,因为在nodejs或客户端上使用JSON之前,您不需要解码UTF-8阵列。