gpt4 book ai didi

javascript - WebSocket onopen - 有时仅发送消息

转载 作者:行者123 更新时间:2023-12-03 08:04:36 26 4
gpt4 key购买 nike

我在使用 WebSocket 时遇到了一个奇怪的问题。当我打开一个新的套接字时,我让服务器和客户端互相发送握手消息。但是,该代码似乎仅有时会执行。

服务器代码(ruby):

# 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.

每次“Ping!”发布后,客户端还会收到发给它的握手消息。所以失败是双方的——当它起作用时,双方都会收到他们的消息。

这可能是什么原因造成的?

最佳答案

这可能是 EventMachine::WebSocket 的问题吗?

我想知道是否所有的连接关闭都是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

祝你好运。

附注默认端口为 3000。

如果需要,您可以使用:

Plezi.port = 8080

或者使用 -p 参数运行脚本(如果不使用 irb,则省略 exit 指令):

$ ruby ./server.rb -p 8080

关于javascript - WebSocket onopen - 有时仅发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34441269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com