【问题标题】:child process writing to socket - localhost sent an invalid response子进程写入套接字 - 本地主机发送无效响应
【发布时间】:2018-10-20 03:11:46
【问题描述】:

我在父进程中有这个:

import cp = require('child_process');
const k = cp.fork(file);

 app.use(function(req,res,next){       
      k.send('handle', req.socket);       
 };

然后我在子进程中有这个:

process.on('message', function (m, socket) {

  if (m === 'handle' && socket) {
    socket.end('foobar!!!');
  }
  else{
    console.log('nope');
  }

});

在做了一些记录之后,我知道socket.end('foobar!!!'); 被调用了。但是我在浏览器中看到了这个错误:

任何人都知道如何使用我可以使用的普通套接字发送有效响应?

我想我需要学习如何实际编写有效的 HTTP 响应,以前从未尝试过。

【问题讨论】:

  • 这个例子是相关的:nodejs.org/api/…
  • 它似乎只是写入套接字,但它在服务器配置中使用pauseOnConnect
  • 我在 Node.js 问题跟踪器上提交了一个关于这个问题的问题:github.com/nodejs/node/issues/20644
  • 您是否意识到仅发送foobar!!! 不是有效的http 响应?为什么不尝试发送实际的 http 响应。
  • @jfriend00 我想也许 Express 事先为我写了一些标题。你能展示如何从头开始编写有效的响应吗?

标签: node.js sockets http express tcp


【解决方案1】:

当你这样做时:

socket.end('foobar!!!');

您只是发送foobar!!!,这不是有效的http 响应,这正是您的客户端错误消息告诉您的内容。

因为你已经把这个socket传递给了另一个进程,并且express还没有在原始进程中向那个socket写入任何东西,所以你需要在这里发送一个完整的有效http响应。

http 响应如下所示:

归功于this article 图片。

因此,一个非常简单的 http 响应可能如下所示:

socket.end('HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nConnection: close\r\n\r\nHello');

【讨论】:

  • \r\n 没有必要,它永远不会被 Windows 浏览器处理,哈哈,或者这是 IE 的? :)
  • @AlexanderMills - 老实说,我不确定,但是当我查看它时,HTTP 规范要求标头之间有CRLF,并且标头和内容之间需要两次。
猜你喜欢
  • 2019-03-11
  • 1970-01-01
  • 2021-11-28
  • 2015-03-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 2017-11-06
相关资源
最近更新 更多