这是我关于stackoverflow的第一个问题。当然,这个问题围绕着我很多天。我正在编程一个聊天应用程序使用node.js作为服务器,这里的服务器代码:
var net = require('net');
var chatServer = net.createServer(),clientList = [];
chatServer.on("connection", function(client){
client.name = client.remoteAddress + ":" + client.remotePort;
console.log(client.name);
client.write("Hi!n");
clientList.push(client);
client.on("data",function(data){
console.log(data);
broadcast(data,client);
})
})
chatServer.listen(1234);
function broadcast(message,client){
var cleanup = [];
for(var i=0;i<clientList.length;i++){
if(client != clientList[i]){
if(clientList[i].writable){
clientList[i].write(client.name = message);
} else {
cleanup.push[clientList[i]];
clientList[i].destroy();
}
}
}
}
在发送文本时没问题,但是当发送图像时,一旦node.js默认缓冲区已满(因为图像足够大,所以缓冲区包含图像的一部分),它将执行下面的代码
client.on("data",function(data){
console.log(data);
broadcast(data,client);
和另一个客户端只接收部分图像数据。我的想法是创建一个新的缓冲区,如:
buffer += data;
,但我不知道如何检测图像边界,以便我可以将新的缓冲区数据发送到其他客户端。我该如何解决这个问题,请帮忙…
实际上,这不是一个关于nodejs或聊天应用程序的问题,而是一个关于协议设计的一般性问题。
你可以在现有协议的基础上使用/设计你的协议:
-
协议缓冲区,由Google: https://github.com/google/protobuf提供支持,这是nodejs中的协议缓冲区实现之一:https://github.com/mafintosh/protocol-buffers
-
RPC, nodejs中的实现之一:http://www.zerorpc.io
-
你自己设计一个简单的:服务器端按照这个顺序反复接收数据:
类型:int,长度:int,主体:bytes
这意味着客户端每次要与服务器交互时都应该遵循此规则,首先发送一个"int"来指示消息类型,然后发送一个"int"来指示消息长度,最后是消息体。
如果您要构建高度可伸缩的大型项目,我建议您使用ProtocolBuffer。或者你设计一个简单的协议(就像我在3中写的那样),如果你正在写一个实践项目。