跳到主要内容

数据传输

2023年12月23日
柏拉文
越努力,越幸运

一、认识


大概遇到的情况就分为定长数据不定长数据的处理吧。

二、定长数据


对于定长的数据包而言,发送端在发送数据的过程中,需要设置Content-Length,来指明发送数据的长度。当然了如果采用了Gzip压缩的话,Content-Length设置的就是压缩后的传输长度。

  • Content-Length如果存在并且有效的话,则必须和消息内容的传输长度完全一致,也就是说,如果过短就会截断,过长的话,就会导致超时。
  • 如果采用短链接的话,直接可以通过服务器关闭连接来确定消息的传输长度。
  • 那么在HTTP/1.0之前的版本中,Content-Length字段可有可无,因为一旦服务器关闭连接,我们就可以获取到传输数据的长度了。
  • 在HTTP/1.1版本中,如果是Keep-alive的话,chunked优先级高于Content-Length,若是非Keep-alive,跟前面情况一样,Content-Length可有可无。

那怎么来设置Content-Length?

const server = require('http').createServer();server.on('request', (req, res) => {  if(req.url === '/index') {   // 设置数据类型    res.setHeader('Content-Type', 'text/plain');    res.setHeader('Content-Length', 10);    res.write("你好,使用的是Content-Length设置传输数据形式");  }})server.listen(3000, () => {  console.log("成功启动--TinaTian");})

三、不定长数据


现在采用最多的就是HTTP/1.1版本,来完成传输数据,在保存Keep-alive状态下,当数据是不定长的时候,我们需要设置新的头部字段

Transfer-Encoding: chunked

通过chunked机制,可以完成对不定长数据的处理,当然了,你需要知道的是

  • 如果头部信息中有Transfer-Encoding,优先采用Transfer-Encoding里面的方法来找到对应的长度。
  • 如果设置了Transfer-Encoding,那么Content-Length将被忽视。
  • 使用长连接的话,会持续的推送动态内容。
const server = require('http').createServer();server.on('request', (req, res) => {  if(req.url === '/index') {   // 设置数据类型    res.setHeader('Content-Type', 'text/html; charset=utf8');    res.setHeader('Content-Length', 10);    res.setHeader('Transfer-Encoding', 'chunked');        res.write("你好,使用的是Transfer-Encoding设置传输数据形式");    setTimeout(() => {      res.write("第一次传输数据给您<br/>");    }, 1000);    res.write("骚等一下");    setTimeout(() => {      res.write("第一次传输数据给您");      res.end()    }, 3000);  }})server.listen(3000, () => {  console.log("成功启动--TinaTian");})