2015-12-23 3 views
0

У меня возникла странная проблема с WebSocket. Когда я открываю новый сокет, у меня есть и сервер, и клиент отправляют сообщения квитирования друг другу. Однако код, похоже, выполняется только иногда.WebSocket onopen - сообщение отправлено иногда

сервера Код (рубин): ​​

# Set up the websocket server on port 8080 
EventMachine::WebSocket.start(:host => "localhost", :port => 8080, :secure => false) do |ws| 
    ws.onopen do 
     ws.send "WebSocket opened on port 8080." 
    end 

    ws.onmessage do |msg| 
     puts msg 
    end 

    ws.onclose do 
     puts "WebSocket closed." 
    end 
end 

код клиента (JavaScript):

connection.onopen = function() { 
    connection.send("Ping!"); 
}; 

connection.onerror = function() { 
    console.log("WebSocket error."); 
}; 

connection.onmessage = function(e) { 
    console.log("Server: " + e.data); 
}; 

Выход консоли на стороне сервера после того, как освежающий, ждет пару секунд каждый раз:

WebSocket closed. 
WebSocket closed. 
WebSocket closed. 
Ping! 
WebSocket closed. 
WebSocket closed. 
WebSocket closed. 
WebSocket closed. 
Ping! 
WebSocket closed. 
WebSocket closed. 

Каждый раз, когда «Пинг!» отправляется, клиент также получает сообщение квитирования, направленное на него. Таким образом, отказ происходит с обеих сторон - когда он работает, обе стороны получают свои сообщения.

Что может быть причиной этого?

ответ

0

Как вы называете Javascript? Есть ли какая-то зависимость, которая должна быть загружена первой? Где определено соединение?

+0

javascript - это файл ReactJS jsx, который загружается на каждую страницу - нет проблем с зависимостью, потому что сокет работает, это просто сообщение подтверждения, которое не отображается. Соединение определено глобально. – NmdMystery

1

Это может быть проблема с EventMachine::WebSocket?

Интересно, все ли соединения закрыты соединениями в сети. Может быть, ваш браузер пытается получить доступ к странице, используя Http?

Возможно ли, что соединения закрываются до того, как будет получен ответ Websocket на «Ping»?

Вы можете попробовать использовать другое решение на стороне сервера, чтобы проверить, может ли это быть проблемой.

Например, вы можете использовать Plezi для проверки клиента и сбора дополнительной информации. то есть (в irb):

require 'plezi' 

class TestController 
    def index 
     puts "Got HTTP request" 
     "Hello World" 
    end 
    def on_open 
     puts "Websocket Opened." 
     write "Websocket Opened." 
    end 
    def on_message data 
     puts "Got: #{data}" 
     write "pong" 
    end 
    def on_close 
     puts "Websocket Closed." 
    end 
end 
route '/', TestController 
# if using `irb`, use: 
exit # to start server 

удачи.

P.S. По умолчанию используется порт 3000.

Если вы хотите, вы можете использовать:

Plezi.port = 8080 

Или запустить скрипт (опустить exit директиву, если не используется irb) с -p аргументом:

$ ruby ./server.rb -p 8080 
0

Это может быть состояние гонки? Учитывая, что js WebSocket подключается во время построения, возможно, вы не сможете добавить обработчик событий onopen до того, как это событие уже было запущено и отправлено (без какого-либо эффекта) неопределенному обработчику?