从PHP到node.js请求连接被拒绝错误

时间:2016-11-22 17:29:23

标签: php node.js

我正在运行苏格兰威士忌盒(在Ubuntu VM中运行的流浪汉LAMP堆栈)

我正在Windows上运行node.js.

这是我的node.js代码:

var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var mysql = require('mysql');

http.listen(3000, function() {
    console.log('listening on port *:3000');
});

app.post('/phpreq', function (req, res) {
var content = req.body;
console.log(content);
res.end('ok');
})

这是我的PHP代码:

$data = array("request" => "disconnect", "userid" => "5");                                                                    
$data_string = json_encode($data);

$ch = curl_init('http://localhost:3000/phpreq');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($data_string))                                                                       
);                                                                                                                   

echo curl_exec($ch)."\n";
if (curl_errno($ch)) {
    die('Couldn\'t send request: ' . curl_error($ch));
}
curl_close($ch);

我收到的错误是:无法发送请求:无法连接到localhost端口3000:拒绝连接

我已尝试禁用防火墙并允许端口3000通过我的防火墙。

如何解决此错误?

2 个答案:

答案 0 :(得分:0)

您必须确保连接的端口3000位于正确的主机上。

您可能需要使用网关地址(在来宾操作系统上运行netstat -rn来查看它是什么),使用localhost以外的本地IP地址以便使用正确的接口,或者使用某种形式的端口转发(从guest 3000到主机3000)。

当您在vagrant框中使用localhost(或127.0.0.1,它是相同的)时,您访问该框上的端口,而不是主机上的端口。

有几种方法可以在Vagrant中配置网络,因此您需要阅读文档并查看它是如何处理的。

请参阅:

答案 1 :(得分:0)

我设法解决了这个问题。我通过在node.js中监听0.0.0.0并使用192.168.33.10(用于cURL发布请求的PHP中的vagrant的IP)来解决它。

我的新node.js代码:

var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var mysql = require('mysql');

http.listen(3000, function() {
    console.log('listening on port *:3000');
});

app.post('/phpreq', function (req, res) {
var content = req.body;
console.log(content);
res.end('ok');
})

新的PHP代码:

$data = array("request" => "disconnect", "userid" => "5");                                                                    
$data_string = json_encode($data);

$ch = curl_init('http://192.168.33.1:3000/phpreq');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    'Content-Type: application/json',                                                                                
    'Content-Length: ' . strlen($data_string))                                                                       
);                                                                                                                   

echo curl_exec($ch)."\n";
if (curl_errno($ch)) {
    die('Couldn\'t send request: ' . curl_error($ch));
}
curl_close($ch);