我有nodejs监听tcp端口并从Flash XMLSocket获取内容。如果我尝试从flash(XMLSocket.send(long_message)
)中的一条消息中推送大量数据,那么我总是会在事件stream.on("data", function(d) {
被触发时发送,而我希望在传输整个消息时发生这种情况。
Flash的XMLSocket将数据传输为以空字节终止的UTF8编码字符串。
如何控制邮件的一致性?
我发现了类似的问题here。但是没有明确的答案。我知道我的消息的结尾应该是空字节,但是请你举个例子来说明如何存储不完整的消息并避免与下一个/并发消息重叠
在maerics回答之后我做了类似的事情
var server = net.createServer(function(stream) {
var dataBlock = "";
stream.on("data", function(d) {
processChunk(d);
});
function processChunk(data) {
var chunks = data.split("\0");
while (chunks.length > 1) {
if (dataBlock.length > 0) {
dataBlock += chunks.shift();
processIncompingMessage(dataBlock);
dataBlock = "";
}
else {
processIncompingMessage(chunks.shift());
}
}
dataBlock += chunks.shift();
}
}
答案 0 :(得分:4)
这就是我要做的(测试):
var net = require('net');
var server = net.createServer(function (conn) {
var msg = ''; // Current message, per connection.
conn.setEncoding('utf8');
conn.on('message', function (m) {
console.log('MESSAGE: ' + m);
});
conn.on('data', function (data) {
msg += data.toString('utf8');
if (msg.charCodeAt(msg.length - 1) == 0) {
conn.emit('message', msg.substring(0, msg.length - 1));
msg = '';
}
});
});
请注意,可能会在单个数据块中编码多个空值分隔的消息,因此您应该展开此示例以使用空字符分隔数据并分别处理每个数据。此外,您可能希望在连接'end'
事件上处理最终的,可能不完整的消息。