Skip to content

Instantly share code, notes, and snippets.

@jcarroyo
Created April 6, 2016 02:09
Show Gist options
  • Save jcarroyo/03f349d2e201fe0c988fd8e5f8c72405 to your computer and use it in GitHub Desktop.
Save jcarroyo/03f349d2e201fe0c988fd8e5f8c72405 to your computer and use it in GitHub Desktop.
Node.js send file with pure socket (low level transfer)
var net = require('net');
var socket = new net.Socket();
socket.connect(5000, "127.0.0.1");
var fs = require('fs');
var path = require('path');
var packets = 0;
var buffer = new Buffer(0);
socket.on('data', function(chunk){
packets++;
console.log(chunk);
buffer = Buffer.concat([buffer, chunk]);
});
socket.on('close', function(){
console.log("total packages", packets);
var writeStream = fs.createWriteStream(path.join(__dirname, "out.jpg"));
console.log("buffer size", buffer.length);
while(buffer.length){
var head = buffer.slice(0, 4);
console.log("head", head.toString());
if(head.toString() != "FILE"){
console.log("ERROR!!!!");
process.exit(1);
}
var sizeHex = buffer.slice(4, 8);
var size = parseInt(sizeHex, 16);
console.log("size", size);
var content = buffer.slice(8, size + 8);
var delimiter = buffer.slice(size + 8, size + 9);
console.log("delimiter", delimiter.toString());
if(delimiter != "@"){
console.log("wrong delimiter!!!");
process.exit(1);
}
writeStream.write(content);
buffer = buffer.slice(size + 9);
}
setTimeout(function(){
writeStream.end();
}, 2000);
});
var net = require('net');
var fs = require('fs');
var path = require('path');
var fileName = "escondidas.jpg";
var filePath = path.join(__dirname, fileName);
var server = net.createServer(function(client){
var packages = 0;
var totalBytes = 0;
var readStream = fs.createReadStream(filePath, {highWaterMark: 16384});
readStream.on('data', function(chunk){
packages++;
var head = new Buffer("FILE");
var sizeHex = chunk.length.toString(16);
while(sizeHex.length < 4){
sizeHex = "0" + sizeHex;
}
var size = new Buffer(sizeHex);
console.log("size", chunk.length, "hex", sizeHex);
var delimiter = new Buffer("@");
var pack = Buffer.concat([head, size, chunk, delimiter]);
totalBytes += pack.length;
client.write(pack);
});
readStream.on('close', function(){
client.end();
console.log("total packages", packages);
console.log("total bytes sent", totalBytes);
});
client.on('error', function(){
console.log("error del cliente");
});
client.on('close', function(){
console.log("terminó comunicación con cliente");
});
});
server.listen(5000);
server.on('listening', function(){
console.log("servidor escuchando");
});
server.on('error', function(err){
console.log("error del servidor");
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment