node.js - socket.io 在客户端不工作(传输错误)

标签 node.js sockets laravel-5

我正尝试按照教程 https://laracasts.com/discuss/channels/general-discussion/step-by-step-guide-to-installing-socketio-and-broadcasting-events-with-laravel-51 来实现套接字. 我让 node.js 运行,reddis 工作并且端口 3000 正在监听。我可以在命令行上获取控制台消息。当我尝试向客户端发送任何内容时出现问题。 服务器端:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();
redis.subscribe('test-channel', function(err, count) {
});
redis.on('message', function(channel, message) {
    console.log('Message Recieved: ' + message);
    message = JSON.parse(message);
    io.emit(channel + ':' + message.event, message.data);
});
http.listen(3000, function(){
    console.log('Listening on Port 3000');
});

客户端:

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.7/socket.io.min.js"></script>
<script>
    var socket = io('http://localhost:3000');
    //var socket = io('http://192.168.10.10:3000');
    socket.on("test-channel:App\\Events\\EventName", function(message){
        console.log("Working");
        // increase the power everytime we load test route
        $('#power').text(parseInt($('#power').text()) + parseInt(message.data.power));
    });

我尝试使用“localStorage.debug = '*';”通过浏览器控制台进行调试我收到以下消息:

engine.io-client:socket socket error {"type":"TransportError","description":{}} +4ms 
socket.io-client:manager connect_error +4ms 
socket.io-client:manager reconnect attempt error +1ms 
socket.io-client:manager will wait 5000ms before reconnect attempt +0ms 
engine.io-client:socket socket close with reason: "transport error" +1ms 
engine.io-client:polling transport not open - deferring close +1ms 
socket.io-client:manager attempting reconnect +5s 
socket.io-client:manager readyState closed +1ms

我尝试了所有可用的示例,我还尝试了 socket.io 网站上的基本示例,但没有任何效果。任何帮助表示赞赏。谢谢

经过几天的挖掘,我发现 socket.io 在本地主机上工作得很好,但在外部域中不起作用。我也试过改

var socket = io('http://localhost:3000');

var socket = io('http://serverip:3000');

但这并没有帮助。 Chrome 浏览器给我错误:

GET http://serverip:3000/socket.io/?EIO=3&transport=polling&t=LDrVJCA Request.create @ socket.io.min.js:1Request @ socket.io.min.js:1XHR.request @ socket.io.min.js:1XHR.doPoll @ socket.io.min.js:1Polling.poll @ socket.io.min.js:1Polling.doOpen @ socket.io.min.js:1Transport.open @ socket.io.min.js:1Socket.open @ socket.io.min.js:1Socket @ socket.io.min.js:1Socket @ socket.io.min.js:1Manager.open.Manager.connect @ socket.io.min.js:2(anonymous function) @ socket.io.min.js:3
feedTest:1 XMLHttpRequest cannot load http://serverip:3000/socket.io/?EIO=3&transport=polling&t=LDrVJCA. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://example.com' is therefore not allowed access. The response had HTTP status code 502.

如果有任何帮助,我将不胜感激。谢谢

最佳答案

这是因为CORS

你可以使用jsonp来避免它:

    $.ajax({
       type: "POST",
       dataType: 'jsonp',
       ...... etc ....
     })

编辑

对于 socket io 做这个:

var socket = io('http://localhost:3000');
socket.set("origins","*");

编辑

var socket = io('http://localhost:3000',{origins:'localhost:* http://localhost:* http://www.localhost:*'});

var socket = io('http://localhost:3000',{origins:"*"});

关于node.js - socket.io 在客户端不工作(传输错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35959222/

相关文章:

php - Laravel,从迁移创建 MySQL 触发器

Laravel php artisan 产生错误

node.js - 我的 websocket 服务器会影响 Nodejs 服务器吗?

Node.js async.series 与现有功能

c++ - 客户端未收到 UDP 连接响应

java - 使用 Java 通过 TCP 发送 JSON 对象

Node.js Passport 反序列化 Users 返回 20 多个相同用户

javascript - 调试 domjs 和 highcharts

C Socket写HTTP GET请求: error 400

laravel - 在 Laravel 中打印查询