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 显然,这有很多问题: >如果我向大量设备发送消息,并且在处理过程中途发送了失败消息,那么在我尝试发送到所有设备之前,我不会真正看到错误. 我尝试解决此问题的一种方法是在单独的线程中从套接字读取: 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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |