【发布时间】:2010-07-19 06:47:39
【问题描述】:
我正在尝试在我的 Rails 应用程序中实现对 Apple 增强型推送通知消息格式的支持,但遇到了一些令人沮丧的问题。我显然不像我想象的那样理解套接字。
我的主要问题是,如果我正确发送所有消息,我的代码就会挂起,因为 socket.read 会阻塞,直到我收到消息。如果您的消息看起来不错,Apple 不会返回 任何内容,因此我的程序会锁定。
这是我如何工作的一些伪代码:
cert = File.read(options[:cert])
ctx = OpenSSL::SSL::SSLContext.new
ctx.key = OpenSSL::PKey::RSA.new(cert, options[:passphrase])
ctx.cert = OpenSSL::X509::Certificate.new(cert)
sock = TCPSocket.new(options[:host], options[:port])
ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
ssl.sync = true
ssl.connect
messages.each do |message|
ssl.write(message.to_apn)
end
if read_buffer = ssl.read(6)
process_error_response(read_buffer)
end
显然,这样做存在许多问题:
- 如果我正在向大量设备发送消息,并且在处理过程中发送了失败消息,那么在我已经尝试发送到所有设备之前,我不会真正看到错误。
- 如前所述,如果 Apple 可以接受所有消息,我的应用程序将挂起套接字读取调用。
我尝试解决此问题的一种方法是在单独的线程中读取套接字:
Thread.new() {
while data = ssl.read(6)
process_error_response(data)
end
}
messages.each do |message|
ssl.write(message.to_apn)
end
ssl.close
sock.close
这似乎不起作用。数据似乎永远不会从套接字中读取。这可能是我对套接字应该如何工作的误解。
我想到的另一个解决方案是进行非阻塞读取调用...但似乎 Ruby 直到 1.9 才对 SSLSocket 进行非阻塞读取调用...遗憾的是我现在无法使用。
能否请对套接字编程有更好理解的人指出正确的方向?
【问题讨论】:
标签: ruby-on-rails ruby sockets push-notification apple-push-notifications