2016-03-12 2 views
2

Я пытаюсь реализовать сокеты, следуя руководству https://laracasts.com/discuss/channels/general-discussion/step-by-step-guide-to-installing-socketio-and-broadcasting-events-with-laravel-51. У меня работает node.js, работает reddis и порт 3000. Я могу получить консольные сообщения в командной строке. Проблема возникает, когда я пытаюсь испустить что-либо на стороне клиента. Sever сторона:socket.io не работает на стороне клиента (транспортная ошибка)

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 отлично работает на локальном хосте, но не работает из extrernal домена. Я также попытался изменить

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. 

Я бы очень признателен за любую помощь. Благодаря

ответ

0

Это потому, что CORS

Вы можете использовать JSONP, чтобы избежать этого:

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

EDIT

Для сокета И.О. сделать это:

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

EDIT

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

ИЛИ

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

Не могли бы вы представить полный пример, так как я не знаю, куда вставить предложенный код. Спасибо – user3549162

+0

обновленный ответ, см. – alexey

+0

socket.set не является функцией, которая была удалена в версии сокета 1.x. У вас есть еще предложения? Заранее спасибо. – user3549162

0

С помощью на laracasts.com мне удалось решить эту проблему. Порт 3000 был закрыт для рекламы, поэтому он работал только на localhost. Благодаря алексей за помощь.

Смежные вопросы