这是我关于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;
但我不知道如何检测图像边界,以便我可以将新的缓冲区数据发送给其他客户端。 我怎么能解决这个问题,请帮忙......抱歉我的英语不好。
答案 0 :(得分:0)
实际上,这不是关于nodejs或chat app的问题,这是关于协议设计的一般性问题。
您可以根据现有协议使用/设计协议:
ProtocolBuffer,由Google提供:https://github.com/google/protobuf,这是nodejs中的ProtocolBuffer实现之一:https://github.com/mafintosh/protocol-buffers
RPC,nodejs中的一个实现: http://www.zerorpc.io
设计您自己的简单:服务器端重复按此顺序接收数据:
type:int,length:int,body:bytes
这意味着客户端每次与服务器交互时都应遵循此规则,首先发送“int”以指示消息类型,然后发送“int”以指示消息的长度,最后发送消息体。
如果您要构建高度可扩展的大型项目,我建议您使用ProtocolBuffer。或者你设计了一个简单的协议(就像我在3中写的那样),如果你正在编写一个练习项目。