文件传输在node.js服务器和socket.io客户端之间挂起(但没有错误)

时间:2013-11-30 11:57:04

标签: javascript node.js socket.io

我想使用socket.io(socket.io-client)传送带有node.js的文件并传送。

我尝试在服务器端执行此操作:

//// 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

有谁知道,出了什么问题?

1 个答案:

答案 0 :(得分:0)

首先,NPM存储库中delivery的版本已过期,并包含一些错误。您应该从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)。