Laravel 中的 Socket.io 轮询 404

Posted

技术标签:

【中文标题】Laravel 中的 Socket.io 轮询 404【英文标题】:Socket.io polling 404 in Laravel 【发布时间】:2014-09-30 23:48:38 【问题描述】:

我正在尝试使用 Socket.io 实现一个聊天应用程序 进入我的 Laravel 应用程序。聊天应用程序本身就可以正常工作, 但我无法让它在 Laravel 中运行。

我尝试在 8000 端口上服务 Laravel,在 8000 端口上服务聊天服务器。 我使用 Express 4.8.0 和 Socket.io 1.0.6、Node 0.10.29 和 nodemon 进行测试。

//server.js:

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

http.listen(8000, function () 
 console.log('listening on *:8000');
);

app.use('/', express.static(__dirname + '/public'));
app.get("/*", function (req, res)
 res.sendFile(__dirname + "/index.php");
);

//client.js:

var socket            = io.connect('http://localhost:8000');

//html - 依赖项,我尝试了所有这些:

<script src="//cdn.socket.io/socket.io-1.0.0.js"></script>
 HTML::script('/socket.io/socket.io.js') 
<script src="http://localhost:8000/socket.io/socket.io.js" ></script>
<script src="asset('/socket.io/socket.io.js')"></script>

然后是客户端(自己的代码)

 HTML::script('js/client.js') 

CDN 版本的 Socket.io 不断地给出这些类型的日志:

"GET http://localhost:8000/socket.io/?EIO=2&transport=polling&t=1407425555977-15 404 (Not Found)".

其他的只是给出一个未找到的js文件日志:

"GET http://localhost:8000/socket.io/socket.io.js 404 (Not Found)"

//文件夹结构:

/公开

/js

client.js

/node_modules

server.js

谁能看到我可以做些什么来使它工作?

编辑 //server.js

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

var app     = express();
var server  = http.createServer(app);

var io      = socket.listen(server);

io.on('connection', function (socket) 
 console.log("Connected server");


server.listen(8000);

//client.js

var socket;
$(document).ready(function () 
 socket            = io.connect('http://localhost:8000');
);

//当我在日志中输入全局“socket”对象时,它会说:

connected: false
disconnected: true

【问题讨论】:

你不能在同一个端口上服务两个应用程序。 我现在更改了 Socket.io 的端口号,它现在显示:“已连接客户端”。使用 Blubberguy22 的代码。所以我想我现在准备好了 :) 谢谢^^ 是的。这可能是因为 8000 是一个比较常见的端口,它被其他一些应用程序所取代。 【参考方案1】:

这是因为您设置不正确。我遇到了与您完全相同的问题(相同的错误和基本代码布局)。您需要在页面的基本目录中执行npm install socket.io --save(与您的 index.php 文件所在的位置相同)。然后你必须对 express (npm install express --save) 做同样的事情。您还必须更改服务器代码。将io的创建从:

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

收件人:

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

var app = express();
var server = http.createServer(app);

var io = socket.listen(server);

然后删除app.useapp.get,因为这将不再需要它们来完成。然后在 server.js 的末尾添加server.listen(8000);。对于依赖项,请使用:&lt;script src="//cdn.socket.io/socket.io-1.0.0.js"&gt;&lt;/script&gt;。然后,要运行您的服务器,请在终端中转到它并输入node server.js。然后只需与您的客户端连接即可。此外,对于服务器中的事件,请使用:

io.on('connection', function (client) 
    client.on('someEvent', function(someVariables)
        //Do something with someVariables when the client emits 'someEvent'
        io.emit('anEventToClients', someData);
    );
    client.on('anotherEvent', function(someMoreVariables)
        //Do more things with someMoreVariables when the client emits 'anotherEvent'
        io.emit('anotherEventToClients', someMoreData);
    );
);

在您的客户端代码中:

socket.emit('someEvent', variables);
socket.on('anEventToClients', function(something)
    //Code when anEventToClient is emitted from the server
);

【讨论】:

我更改了你所说的代码(并使用 CDN 版本),它仍然给我轮询传输 404 问题。 你能把你的新代码贴在你的旧代码下吗? 如果 socket.io 试图向那个 URL 发出 ajax 请求,那么 Web 套接字连接可能没有正确打开。检查上面@Blubberguy22 提到的服务器代码。

以上是关于Laravel 中的 Socket.io 轮询 404的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 socket.io 实现长轮询?

当远程但不是本地时,Socket.io 退回到 nginx 代理后面的轮询(websocket 给出 400)

websocket 后台新订单通知 —— Laravel 5.8 workman PHPSocket.IO教程

websocket 后台新订单通知 —— Laravel 5.8 workman PHPSocket.IO教程

socket.io 啥时候使用轮询而不是 websockets?

Socket.io 连接恢复为轮询,从不触发“连接”处理程序