【问题标题】:EPIPE on net.connect to an HTTP server网络上的 EPIPE。连接到 HTTP 服务器
【发布时间】:2019-12-07 20:47:16
【问题描述】:

我正在尝试使用 roder 中的 net.connect 连接到节点 http 服务器套接字 (expressJs),以将该套接字传递给我的 repl,以便能够基本上连接到我的 http 服务器并启动命令。

当我尝试这个时,我在启动 repl 的第二秒得到了错误 EPIPE。

这里是repl的代码:

const args = process.argv.slice(2);
if (args.length < 1) {
  process.exit(1);
}

const url = args[0];
const [host, port] = url.split(':');

//this will get the url to connect to
const socket = net.connect(parseInt(port), host);

process.stdin.pipe(socket);
socket.pipe(process.stdout);

Console.start({
  expose: { container, Metric:metricsObject},
  socket:socket
});

启动函数:

start(options = {}) {
    const { expose, socket } = options;
    const repl = REPL.start({
        eval: promisableEval,
        terminal:true,
        input: socket,
        output: socket,
    });

    Object.assign(repl.context, expose);
}

http 服务器正在运行:

const http = this.express
    .listen(this.config.web.port, () => {
      const { port } = http.address();
      this.logger.info(`[p ${process.pid}] Listening at port ${port}`);
      resolve();
    });

this.express 只是 express 的一个实例:this.express = express();

【问题讨论】:

    标签: javascript node.js express read-eval-print-loop


    【解决方案1】:

    您似乎正试图通过说诸如 http://mine.example.com:3000/path/item 之类的 URL 连接到 http(或 https?)服务器

    net.connect(parseInt('3000/path/item'), 'http://mine.example.com');
    

    由于多种原因,它无法正常工作。

    1. 除非您是 http 协议方面非常出色的程序员专家,否则您不应使用 net.connect 与 http 服务器通信。尝试改用http.clientRequest

    2. 传递给 net.connect 的主机名应该是原始机器名,例如 'mine.example.com',并且前面不能有协议说明符。

    3. 端口,类似。

    对不起,我不明白你想用标准输入和标准输出做什么。但是您的socket 将无法使用,直到它的连接操作完成并且您收到一个宣布这一点的事件。

    您可以使用旧的telnet 程序连接到http 服务器。它可以让您向服务器输入内容,然后显示您返回的内容。在你的情况下,你会这样做

     telnet localhost 3000  # from shell your command line
    

    然后服务器连接并坐在那里等待。你输入

     GET / HTTPS/1.0
    

    然后两个&lt;Enter&gt;s。然后,如果您将http://localhost:3000 放入浏览器位置行,则服务器会发回它会发送的任何内容。 然后关闭连接。

    我不确定该 http 协议操作如何适合您的 REPL。

    您在https://medium.com/trabe/mastering-the-node-js-repl-part-3-c0374be0d1bf 中提到的示例没有连接到http 服务器,而是连接到了tcp 服务器。 Http 服务器(包括所有的 node/express 服务器)是 tcp 服务器的一个亚种,但它们在 tcp 协议上叠加了 http 协议。 http 协议不适合 REPL 的来回对话风格。

    【讨论】:

    • 我在 net.connect 中使用的主机和端口正好是:'localhost' 和 '3000',它们是我的 Web 服务器运行的确切主机和端口。使用标准输入和标准输出,我试图将我正在运行的 repl 进程的标准输入链接到我的网络服务器,并将服务器的标准输出链接到我的 repl 进程。我只是想将一个 repl 连接到一个正在运行的节点 http 服务器
    • 所以我从 http req.socket 获得的套接字不适合我尝试使用的 tcp repl。我如何从 http 套接字中获取 tcp 套接字,因为后者只是第一个之上的一层。
    • 我的telnet 示例展示了如何假装 http 连接是普通的 tcp 连接。但是尝试将 REPL 挂接到 http 连接中的 tcp 套接字就像尝试与软饮料分配器进行对话一样。它所知道的只是根据请求提供百事可乐罐头。它非常擅长大规模地这样做,但对于其他任何事情都毫无价值。您的预期项目包含类别错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    相关资源
    最近更新 更多