套接字 io 客户端 net::ERR_CONNECTION_REFUSED

socket io client net::ERR_CONNECTION_REFUSED

我目前正在构建一个带有实时通知的待办事项应用程序。

上下文 我用 PHP (Laravel 4) 构建后端,用 AngularJS (yeoman:generator-angular) 构建前端。这两个应用程序不在同一个域中(backend.herokuapp.com 和 frontend.herokuapp.com)。客户端通过 public API.

与服务器对话

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

服务器 我使用 https://github.com/Wisembly/elephant.io 作为 PHP 和 "emitter example" 的服务器。当点击我的 API 的 url 时,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 文件。 我正在为 Laravel.

使用 Homestead

客户 我的客户在另一个应用程序上,所以我在我的 bower 文件中导入了 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 客户端之间建立连接。

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

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

现在一切正常。

谢谢大家!

我刚刚遇到了同样的问题。这是因为您正在使用虚拟机并且需要显式端口转发。

.homestead/中编辑Homestead.yaml如下:

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

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