【问题标题】:Node.js file transfer using UDP使用 UDP 传输 Node.js 文件
【发布时间】:2015-03-06 01:36:07
【问题描述】:

我正在尝试创建一个简单的 Node.js 服务器,通过 UDP 从客户端接收文件。我遇到的问题是,每次我尝试传输一个大文件(任何超过 100kb 的文件)时,服务器似乎都没有响应。到目前为止,我已经成功地传输了高达 50kb 的文件。

有什么办法可以解决这个问题吗?

客户代码:

var PORT = 33333;
var HOST = 'localhost';
var dgram = require('dgram');
var log = require('sys').log;
var client = dgram.createSocket('udp4');
var fs = require("fs");

fs.readFile('C:\\test.pdf', function (err,data) {
  if (err) {
    return console.log(err);
  }
  client.send(data, 0, data.length, PORT, HOST, function(err, bytes) {
    if (err) 
        throw err;
    log('UDP file sent to ' + HOST +':'+ PORT);
    log('File sise: ' + data.length);
  });
});

服务器代码:

var PORT = 33333;
var HOST = 'localhost';
var dgram = require('dgram');
var server = dgram.createSocket('udp4');
var fs = require("fs");
var log = require('sys').log;
var wstream = fs.createWriteStream('test.pdf');

wstream.on('finish', function () {
  console.log('file has been written');
});

server.on('message', function (message, remote) {
    wstream.write(message);
    wstream.end();
});

server.bind(PORT, HOST);

【问题讨论】:

  • 通过 UDP 传输这样的文件是一个坏主意,恕我直言。您可能会错过使用 UDP 的数据包,这意味着您最终可能会得到一个不完整的文件。为什么不使用 TCP?
  • 如果你能提供帮助,绝对不要为此使用 UDP。除了丢弃的数据包外,数据包乱序到达的情况非常。 TCP 为您解决所有这些问题。
  • 我知道 TCP 更好,使用 UDP 以外的其他方式是可行的方法。我只是好奇是什么导致了这个问题以及如何解决它。

标签: javascript node.js file stream udp


【解决方案1】:

来自dgram 文档:

有效负载长度字段为 16 位宽,这意味着正常有效负载不能大于 64K 八位字节,包括 Internet 标头和数据(65,507 字节 = 65,535 - 8 字节 UDP 标头 - 20 字节 IP 标头);这对于环回接口来说通常是正确的,但是对于大多数主机和网络来说,如此长的数据报是不切实际的。

您不能发送超过 65,507 字节的数据报。这是对 UDP 的硬性限制。听起来您应该为这些文件使用更高级别的协议。

【讨论】:

  • 非常感谢。我将尝试将文件切成块并传输块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多