Javascript 连接到HTTP服务器
我正在尝试使用roder中的net.connect连接到一个节点http服务器套接字(expressJs),以将该套接字传递给我的repl,从而能够基本上连接到我的http服务器并启动命令 在尝试此操作时,我在启动repl的第二个步骤时就出现了错误 以下是repl的代码:Javascript 连接到HTTP服务器,javascript,node.js,express,read-eval-print-loop,Javascript,Node.js,Express,Read Eval Print Loop,我正在尝试使用roder中的net.connect连接到一个节点http服务器套接字(expressJs),以将该套接字传递给我的repl,从而能够基本上连接到我的http服务器并启动命令 在尝试此操作时,我在启动repl的第二个步骤时就出现了错误 以下是repl的代码: const args = process.argv.slice(2); if (args.length < 1) { process.exit(1); } const url = args[0]; const [h
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
});
正在运行的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()代码>看起来您正试图通过类似URL的URL连接到http(或https?)服务器http://mine.example.com:3000/path/item
说
net.connect(parseInt('3000/path/item'), 'http://mine.example.com');
它不起作用的原因有很多
除非您是http协议方面相当出色的程序员专家,否则您不应该使用net.connect
与http服务器通信。试着改用
传递给net.connect的主机名应该是原始机器名,如'mine.example.com'
,前面不带协议说明符
港口,类似的
对不起,我不明白你想用stdin和stdout做什么。但是您的套接字
在其连接操作完成并且您收到一个事件通知之前,不会准备好使用
您可以使用旧的telnet
程序连接到http服务器。它允许您在服务器上键入内容,然后显示返回的内容。对你来说,你会的
telnet localhost 3000 # from shell your command line
然后,服务器连接并坐在那里等待。你打字
GET / HTTPS/1.0
然后是两个
s。然后,如果您输入http://localhost:3000
插入浏览器位置行。然后关闭连接
我不确定http协议操作如何适合您的REPL
您在中提到的示例没有连接到http服务器,而是连接到tcp服务器。Http服务器(包括所有node/express服务器)是tcp服务器的一个子种,但它们将Http协议分层到tcp协议上。http协议不适合REPL的来回对话方式。看起来您正试图通过类似URL的URL连接到http(或https?)服务器http://mine.example.com:3000/path/item
说
net.connect(parseInt('3000/path/item'), 'http://mine.example.com');
它不起作用的原因有很多
除非您是http协议方面相当出色的程序员专家,否则您不应该使用net.connect
与http服务器通信。试着改用
传递给net.connect的主机名应该是原始机器名,如'mine.example.com'
,前面不带协议说明符
港口,类似的
对不起,我不明白你想用stdin和stdout做什么。但是您的套接字
在其连接操作完成并且您收到一个事件通知之前,不会准备好使用
您可以使用旧的telnet
程序连接到http服务器。它允许您在服务器上键入内容,然后显示返回的内容。对你来说,你会的
telnet localhost 3000 # from shell your command line
然后,服务器连接并坐在那里等待。你打字
GET / HTTPS/1.0
然后是两个
s。然后,如果您输入http://localhost:3000
插入浏览器位置行。然后关闭连接
我不确定http协议操作如何适合您的REPL
您在中提到的示例没有连接到http服务器,而是连接到tcp服务器。Http服务器(包括所有node/express服务器)是tcp服务器的一个子种,但它们将Http协议分层到tcp协议上。http协议不适用于REPL的来回对话方式。我在net.connect中使用的主机和端口正好是:“localhost”和“3000”,它们正是我的web服务器运行的主机和端口。通过stdin和stdout,我试图将我正在运行的repl进程的stdin链接到我的web服务器,并将服务器的stdout链接到我的repl进程。我只是尝试将一个repl连接到一个正在运行的节点http服务器。我确实有点遵循这一点:因此,我从http req.socket获得的套接字不适合我尝试使用的tcp repl。如何从http套接字中取出tcp套接字,因为后者只是第一层之上的一层。我的telnet
示例演示了如何将http连接假装为普通tcp连接。但是,尝试在http连接中将REPL挂接到tcp套接字就像尝试与软饮料分发器进行对话一样。它所知道的只是根据请求提供罐装百事可乐。它真的很擅长大规模地这样做,但对于其他任何事情都毫无价值。您的预期项目包含类别错误。我在net.connect中使用的主机和端口正好是:“localhost”和“3000”,这两个主机和端口正是我的web服务器运行的主机和端口。通过stdin和stdout,我试图将我正在运行的repl进程的stdin链接到我的web服务器,并将服务器的stdout链接到我的repl进程。我只是尝试将一个repl连接到一个正在运行的节点http服务器。我确实有点遵循这一点:因此,我从http req.socket获得的套接字不适合我尝试使用的tcp repl。如何从http套接字中取出tcp套接字,因为后者只是第一层之上的一层。我的telnet
示例演示了如何将http连接假装为普通tcp连接。但是,尝试在http连接中将REPL挂接到tcp套接字就像尝试与软饮料分发器进行对话一样。它所知道的只是根据请求提供罐装百事可乐。它真的很擅长大规模地这样做,但对于其他任何事情都毫无价值。您的预期项目包含类别错误。