2013-11-30 1 views
0

Я хочу передать файл с помощью node.js с помощью socket.io (socket.io-client) и доставки.Передача файла зависает (но без ошибок) между сервером node.js и клиентом socket.io

Я пытался сделать это на стороне сервера:

//// server.js 
var socket = require('socket.io').listen(5000); 
var dl = require('delivery'); 
var fs = require('fs'); 
socket.on('connect', function() { 
    log("Sockets connected"); 
    delivery = dl.listen(socket); 
    delivery.connect(); 
    delivery.on('delivery.connect',function(delivery){ 
     delivery.send({ 
      name: 'file1.zip', 
      path : './file1.zip' 
     }); 
     delivery.on('send.success',function(file){ 
      console.log('File sent successfully!'); 
     }); 
    }); 
}); 

И это на стороне клиента:

//// client.js 
var io = require('socket.io-client'); 
var dl = require('delivery'); 
var fs = require('fs'); 
var socket = io.connect('http://localhost:5000'); 
socket.on('connection', function(socket){ 
    var delivery = dl.listen(socket); 
    delivery.on('receive.success',function(file){ 
     fs.writeFile(file.name, file.buffer, function(err) { 
      if(err) { 
       console.log('File could not be saved: ' + err); 
      } else { 
       console.log('File ' + file.name + " saved"); 
      }; 
     }); 
    }); 
}); 

Об исполнении, нет никакой ошибки, но он висит. стороны сервера:

$ node server.js 
info - socket.io started 
debug - client authorized 
info - handshake authorized Bbzo928wAyTjDX8v06Ic 
debug - setting request GET /socket.io/1/websocket/Bbzo928wAyTjDX8v06Ic 
debug - set heartbeat interval for client Bbzo928wAyTjDX8v06Ic 
debug - client authorized for 
debug - websocket writing 1:: 
debug - emitting heartbeat for client Bbzo928wAyTjDX8v06Ic 
debug - websocket writing 2:: 
debug - set heartbeat timeout for client Bbzo928wAyTjDX8v06Ic 
debug - got heartbeat packet 
debug - cleared heartbeat timeout for client Bbzo928wAyTjDX8v06Ic 
debug - set heartbeat interval for client Bbzo928wAyTjDX8v06Ic 

А на стороне клиента нет выхода:

$ node client.js 

ли кто-нибудь знает, что идет не так?

+0

Я не уверен, что вы можете просто отправить двоичный файл через такой сокет, и почему вы используете node.js и синтаксис на стороне клиента? – adeneo

+0

@adeneo клиент не браузер, а другое приложение Node, и [модуль доставки] (https://npmjs.org/package/delivery) используется – robertklep

+0

@robertklep - это объясняет это, я как-то понял столько же, но просто сказано «клиентская сторона». Никогда не использовал этот модуль, просто использовал [binary.js] (http://binaryjs.com/) для отправки таких файлов. – adeneo

ответ

0

Прежде всего, версия delivery в репозитории NPM устарела и содержит некоторые ошибки. Вы должны установить последнюю версию с GitHub:

$ npm install git+https://github.com/liamks/Delivery.js.git 

Далее, вы путаете некоторые клиентские и серверные части, а именно события, которые каждый должен обрабатывать. Это (несколько см ниже) работает для меня:

//// server.js 
var io = require('socket.io').listen(5000); 
var dl = require('delivery'); 
var fs = require('fs'); 

io.sockets.on('connection', function(socket) { 
    console.log('server: a new client connected'); 
    var delivery = dl.listen(socket); 
    delivery.on('delivery.connect', function(delivery) { 
    delivery.send({ 
     name: 'file1.zip', 
     path : './file1.zip' 
    }); 
    delivery.on('send.success', function(file) { 
     console.log('File sent successfully!'); 
    }); 
    }); 
}); 

//// client.js 
var io = require('socket.io-client'); 
var dl = require('delivery'); 
var fs = require('fs'); 
var socket = io.connect('http://localhost:5000'); 

socket.on('connect', function() { 
    console.log('client: connected to server'); 
    var delivery = dl.listen(socket); 
    delivery.connect(); 
    delivery.on('receive.success', function(file) { 
    // TODO: fs.writeFile(...); 
    }); 
}); 

Тем не менее, кажется, что receive.success событие доставляется клиенту в два раза, по крайней мере, для меня. Я не уверен, почему (я не слишком знаком с delivery).

+0

Я испытываю такую ​​же проблему, получаю. Успех получает удар дважды! –

Смежные вопросы