我有一个简单的eventmachine web socket服务器(eventmachine 1.0.0):
EM.run {
# WebSocket Server
EM::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
ws.onopen do
sid = @channel.subscribe{|msg| ws.send msg }
puts "* new WebSocket client <#{sid}> connected!"
end
ws.onmessage do |msg|
puts "* websocket client <#{@sid}> : #{msg}"
end
ws.onclose do
@channel.unsubscribe(sid)
puts "* websocket client <#{@sid}> closed"
end
end
}我正在尝试使用以下代码通过javascript客户端连接到它:
socket = new WebSocket("ws://localhost:8080");
socket.onopen = function(e) {
socket.send('Connesso');
};
socket.onmessage = function(mess) {
if (mess) {
socket.send(mess);
}
};
socket.onclose = function(e) {
socket.send('Disconnesso');
};在以前的safari版本中,它可以完美地处理客户端无法连接到服务器的最新版本。
我也尝试了上一个Chrome Dev稳定版本,但它不能工作。
web套接字标头已发送,但仍处于挂起状态。
如果我向web套接字发送文本消息,则会收到INVALID_STATE_ERR: DOM Exception 11。
我看到有一个草案更改,但我认为em-websocket 0.3.8已经实现了它。
你能帮我解决这个问题吗?
非常感谢
发布于 2012-11-09 14:45:13
INVALID_STATE_ERR: DOM异常11表示您的websocket尚未处于就绪状态。
您可以通过socket.readyState检查websocket对象的状态,当socket.readyState == 1时,您可以发送消息
我通过使用超时为此创建了一个转折点
timerId = setInterval(sendDataWhenReady, 1000);
function sendDataWhenReady(){
if(socket.readyState == 1){
ws.send(JSON.stringify({"type": 'STATUS', "status": status, "username": logged_in_user}))
clearInterval(timerId);
}
}https://stackoverflow.com/questions/13184214
复制相似问题