Если у меня два сервера, «Клиентский сервер» и «Сервер 2». Задача «Клиент-сервер» - прочитать файл с S3 (AWS) и передать его на «Server2» с помощью socket.io. «Сервер2» должен хранить данные на своем диске.
Клиент-сервер
var paramsWithRange = {
Bucket: bucketParams.Bucket,
Key: bucketParams.Key,
//Range: "bytes = " + byteStart.toString() + "-" + byteStop.toString()
};
router.get('/writeData', function(req, res) {
var ss = require("socket.io-stream");
var io = req.app.get('socketio');
........
............
function readFromS3(){
var ss = require("socket.io-stream");
var dataNodeSocket = io.connect('http://' + IP + ":5000");
var stream = ss.createStream();
var getFileName = nameNodeData['blockToDataNodes'][i]['key'].split('/');
var fileData = {
'mainFile': paramsWithRange['Key'].split('/')[1],
'blockName': getFileName[1]
};
ss(dataNodeSocket).emit('sendData', stream, fileData);
s3.getObject(paramsWithRange).createReadStream().pipe(stream);
}
}
Сервер2
var dataNodeIO = require('socket.io')(server);
var ss = require("socket.io-stream");
dataNodeIO.on('connection', function(socket) {
console.info("Succesfully connected!");
ss(socket).on('sendData', function(stream, data) {
var IP = data['ipValue'];
var blockName = data['blockName'];
var mainFile = data['mainFile'];
dataNode.makeDir(mainFile);
dataNode.addToReport(mainFile, blockName);
stream.pipe(fs.createWriteStream(mainFile + '/' + blockName));
});
});
На данный момент я могу видеть данные, хранящиеся на «Server2», но это только частичные данные, поскольку я могу проверить это, проверив размер файла. Например, я отправляю текстовый файл размером более 100 МБ, я могу видеть только 14 МБ на «Server2».
Я следовал документации socket.io-stream по отправке данных / записи данных, но я не уверен, почему я получаю только частичные данные файла.
@ jfriend00 да, похожий код, пытался решить другую проблему
Вы пытались дождаться подключения dataNodeSocket, прежде чем пытаться передавать на него потоковую передачу?
Итак, когда я выполняю dataNodeSocket.on ('connect', function () {}) и вызываю emit и piping в этом обратном вызове. Кажется, у меня появляется ошибка Ошибка: поток уже отправлен.
Тогда вы, вероятно, делаете это неправильно. Я не могу помочь вам отладить его, не увидев фактический код, который вы пробовали.
Это что-то вроде этого .. dataNodeSocket.on ('connect', function () {ss (dataNodeSocket) .emit ('sendData', stream, fileData); s3.getObject (paramsWithRange) .createReadStream (). Pipe (stream) ;});
Хммм, похоже, что событие connect может срабатывать более одного раза. Он сработает, если ваше соединение socket.io будет прервано и вам потребуется переподключение. Интересно, происходит ли это с тобой? Вы можете console.info() увидеть это с помощью blockName в сообщении консоли. В диагностических целях вы также можете прослушать сообщение reconnect.
Извините, я не подписался, поэтому, если мне нужно это проверить, мне нужно console.info () на стороне server2?
Вам нужно увидеть, не является ли причиной вашей проблемы событие connect, срабатывающее более одного раза для данного сокета (из-за разорванного соединения, которое было повторно подключено).





Относится к вопросу, который вы разместили вчера: stackoverflow.com/questions/49223987/….