加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Ruby,SSLSockets和Apple的增强型APN消息格式

发布时间:2020-12-17 02:27:09 所属栏目:百科 来源:网络整理
导读:我正试图在我的Rails应用程序中实现对Apple增强的推送通知消息格式的支持,并且遇到了一些令人沮丧的问题.我显然不像我想的那样理解插座. 我的主要问题是,如果我正确发送所有消息,我的代码会挂起,因为socket.read将阻塞,直到我收到消息.如果您的消息看起来没
我正试图在我的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似乎并没有在SSLSocket上进行非阻塞读取调用,直到1.9 …我很遗憾现在无法使用它.

能够更好地理解套接字编程的人能指出我正确的方向吗?

解决方法

cam是正确的:处理这种情况的传统方法是使用IO.select

if IO.select([ssl],nil,5)
  read_buffer = ssl.read(6)
  process_error_response(read_buffer)
end

这将检查ssl的“可读性”为5秒,如果可读则返回ssl,否则返回ns.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读