套接字错误“[Errno 9]错误的文件描述符”

时间:2015-05-27 13:12:05

标签: python sockets ssl apple-push-notifications apn

我正在尝试为send ios通知实现代码,但我收到此错误:

File "E:/Python27/apnpush.py", line 9, in <module>
apns.gateway_server.send_notification(token_hex, payload)
File "E:\Python27\lib\site-packages\apns.py", line 544, in send_notification
self.write(self._get_notification(token_hex, payload))
File "E:\Python27\lib\site-packages\apns.py", line 273, in write
return self._connection().write(string)
File "E:\Python27\lib\site-packages\apns.py", line 254, in _connection
self._connect()
File "E:\Python27\lib\site-packages\apns.py", line 230, in _connect
self._ssl = wrap_socket(self._socket, self.key_file, self.cert_file)
File "E:\Python27\lib\ssl.py", line 891, in wrap_socket
ciphers=ciphers)
File "E:\Python27\lib\ssl.py", line 509, in __init__
self._context.load_cert_chain(certfile, keyfile)
IOError: [Errno 9] Bad file descriptor

我的代码如下:

import time
from apns import APNs, Frame, Payload
apns = APNs(use_sandbox=True, cert_file='pushchatcert_production_ori.pem', key_file='pushchatkey_production_ori.pem')
# Send a notification
token_hex = 'b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b87'
payload = Payload(alert="Hello World!", sound="default", badge=1)
apns.gateway_server.send_notification(token_hex, payload)

# Send multiple notifications in a single transmission
frame = Frame()
identifier = 1
expiry = time.time()+3600
priority = 10
frame.add_item('b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b87', payload, identifier, expiry, priority)
apns.gateway_server.send_notification_multiple(frame)

此外,我尝试使用ssl.wrap_socket()实现此功能,但我仍然遇到同样的错误。第二个方法代码是

import ssl
import json
import socket
import struct
import binascii
from ssl import wrap_socket, CERT_NONE, SSLError, PROTOCOL_SSLv23
from ssl import SSLContext
TOKEN = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
PAYLOAD = {
'aps': {
    'alert': 'Hello Push!',
    'sound': 'default'
}
}
def send_push(token, payload):               
    cert='ck.pem'
    # APNS development server
    apns_address = ('gateway.sandbox.push.apple.com', 2195)
    # Use a socket to connect to APNS over SSL
    s = socket.socket()
    sock = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_SSLv3, certfile=cert)
    sock.connect(apns_address)
    # Generate a notification packet
    token = binascii.unhexlify(token)
    fmt = '!cH32sH{0:d}s'.format(len(payload))
    cmd = '\x00'
    message = struct.pack(fmt, cmd, len(token), token, len(payload), payload)
    sock.write(message)
    sock.close()  

if __name__ == '__main__':
    send_push(TOKEN, json.dumps(PAYLOAD))

如何解决此错误?

0 个答案:

没有答案