socket io client net :: ERR_CONNECTION_REFUSED

时间:2015-03-17 18:40:05

标签: javascript angularjs node.js socket.io

我目前正在使用实时通知构建待办事项应用程序。

CONTEXT 我使用PHP(Laravel 4)构建后端,使用AngularJS(yeoman:generator-angular)构建前端。这两个应用程序不在同一个域(backend.herokuapp.com和frontend.herokuapp.com)。客户端通过公共API与服务器通信。

我想向Angular应用程序添加实时通知,当用户创建新待办事项时,我希望在所有连接的浏览器上更新UI。

SERVER 我正在使用https://github.com/Wisembly/elephant.io作为PHP和“发射器示例”的服务器。点击我的API网址时,PHP客户端会在nodejs服务器上发出一个事件。这当前有效,但只有服务器与PHP服务器位于同一个域中。

这是Laravel应用程序的配置

+ app
    + controllers
        - AlertsController.php
+ push
    - server.js

AlertsController.php     

class AlertsController extends ApiController
{
    public function index($userId = null)
    {
        $client = new Client(new Version1X('http://localhost:1337'));
        $client->initialize();
        $client->emit('broadcast', ['foo' => 'bar']);
        $client->close();
    }
}

server.js

var server = require('http').createServer(),
    io     = require('socket.io')(server),
    logger = require('winston'),
    port   = 1337;

// Logger config
logger.remove(logger.transports.Console);
logger.add(logger.transports.Console, {colorize : true, timestamp : true});
logger.info('SocketIO > listening on port ' + port);

io.on('connection', function (socket) {
    var nb = 0;

    logger.info('SocketIO > Connected socket ' + socket.id);

    socket.on('broadcast', function (message) {
        ++nb;
        console.log("broadcast !");
        logger.info('ElephantIO broadcast > ' + JSON.stringify(message));

        io.emit('alert.created', JSON.stringify(message));
    });

    socket.on('disconnect', function () {
        logger.info('SocketIO : Received ' + nb + ' messages');
        logger.info('SocketIO > Disconnected socket ' + socket.id);
    });
});

server.listen(port);

我按npm start启动我的server.js文件。 我正在使用Homestead for Laravel。

客户端 我的客户端在另一个应用程序上,所以我在我的凉亭文件中导入https://github.com/automattic/socket.io-client并包含在项目中。此文件已正确导入(Chrome开发工具的网络面板中200 OK)。 问题是当我设置我的io连接时,我在控制台面板中有“GET http://127.0.0.1:1337/socket.io/?EIO=3&transport=polling&t=1426617086753-0 net :: ERR_CONNECTION_REFUSED”。

我正在使用Grunt创建一个网络服务器。

这是我在客户端文件中所做的:

var socket = io.connect("http://127.0.0.1:1337");
socket.on('alert.created', function (msg) {
    console.log("new alert created", msg);
});

有人知道问题可能来自哪里吗?这很奇怪,我可以在PHP和NodeJS之间建立连接,但不能在我的NodeJS服务器和我的JavaScript客户端之间建立连接。

2 个答案:

答案 0 :(得分:0)

好的,我找到了解决问题的方法。

我从Homestead移除了nodejs服务器并在外面启动它。 然后在我的Laravel应用程序中,我将127.0.0.1更改为我的IP地址。

现在一切正常。

谢谢你们!

答案 1 :(得分:0)

我遇到了同样的问题。这是因为您正在使用虚拟机,您需要明确端口转发。

.homestead/编辑Homestead.yaml中,如下所示:

ports:
    - send: 1337
      to: 1337
      protocol: tcp

重新启动您的VM,它应该按预期工作。