Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检测关闭的套接字或实现Apple推送通知提供程序_Python_Sockets - Fatal编程技术网

Python 如何检测关闭的套接字或实现Apple推送通知提供程序

Python 如何检测关闭的套接字或实现Apple推送通知提供程序,python,sockets,Python,Sockets,我正在开发一个简单的web服务器,它向我的iPhone应用程序发送推送通知。 我曾尝试使用现有的Python包,但它们都存在以下问题: 当发送无效令牌时,Apple将发回错误消息并关闭套接字。我需要发送大量推送通知,但如果其中一个具有无效令牌,其余的将不会发送给苹果 因此,目前我的代码如下所示: for m in messages: socket.send(m) 但当第一条消息包含无效令牌时,苹果会在收到第一条消息后立即关闭套接字,套接字仍会发送所有消息,且不会出现任何错误 我负担不起

我正在开发一个简单的web服务器,它向我的iPhone应用程序发送推送通知。 我曾尝试使用现有的Python包,但它们都存在以下问题:

当发送无效令牌时,Apple将发回错误消息并关闭套接字。我需要发送大量推送通知,但如果其中一个具有无效令牌,其余的将不会发送给苹果

因此,目前我的代码如下所示:

for m in messages:
    socket.send(m)
但当第一条消息包含无效令牌时,苹果会在收到第一条消息后立即关闭套接字,套接字仍会发送所有消息,且不会出现任何错误


我负担不起在每条消息后都超时执行
recv
,因为这会花费太长时间。如何才能知道套接字何时关闭并打开新的套接字?

如果另一端的套接字已关闭,则其上的
recv
应返回
0
或导致错误


您可以检查
send
发送的字节数


更新:您可能希望使用另一种可能性来监视套接字连接是否仍处于活动状态



Update-1:另一种方法可能是在有问题的套接字上运行一个与写操作并行的持续读取线程。。。正如您提到的:时间是您的限制。

如果另一端的插座已关闭,则其上的
recv
应返回
0
或导致错误


您可以检查
send
发送的字节数


更新:您可能希望使用另一种可能性来监视套接字连接是否仍处于活动状态



Update-1:另一种方法可能是在有问题的套接字上运行一个与写操作并行的持续读取线程。。。正如您所提到的:时间是您的极限。

我了解到,在TCP级别,我无法找到发送的数据包。我决定只发送所有消息,然后等待(超时)来自苹果的任何错误消息。如果有任何错误,请重复发送失败的错误


我决定这样做,因为获取无效令牌应该是一个罕见的事件,大多数情况下,所有通知都会通过。

我了解到,在TCP级别,我无法找到发送的数据包。我决定只发送所有消息,然后等待(超时)来自苹果的任何错误消息。如果有任何错误,请重复发送失败的错误


我决定这样做,因为获取无效令牌应该是一个罕见的事件,大多数情况下所有通知都会通过。

我尝试检查发送的字节,但它们看起来都已发送。叹气-是的,这可能会发生。请参阅我的最新评论,以获取有关可能使用Keep-Alive套接字选项的更可靠解决方案的DICSusion链接@谢谢你的回答,但我不认为Keep Alive能解决我的问题。是的,我想运行另一个线程来轮询任何传入的数据包,但即使这样,我也不知道发送了什么数据包。我在下面发布了我决定要做的事情。我试着检查发送的字节,但它们看起来都是发送的。叹气-是的,这可能会发生。请参阅我的最新评论,以获取有关可能使用Keep-Alive套接字选项的更可靠解决方案的DICSusion链接@谢谢你的回答,但我不认为Keep Alive能解决我的问题。是的,我想运行另一个线程来轮询任何传入的数据包,但即使这样,我也不知道发送了什么数据包。我在下面发布了我决定要做的事情。这是检测您是否发送了格式错误的数据包的好方法。无论出于何种原因,它都不会捕捉插座在远端关闭的情况。在这种情况下,您将陷入@alk所指的情况。我不确定这是一个性能方面有多好的解决方案。只等一秒钟会严重影响性能,但你不能保证在这段时间内收到苹果的回音。@MartinKonecny:没错。在我的情况下,结果很好,因为我发送了大量货物。不过,我不确定是否还有其他解决方法。我认为更好的方法是使用两个线程,一个用于向套接字写入,另一个用于侦听。侦听线程将使用
选择
来侦听套接字列表,并返回准备读取的套接字的子集。请参见此处:这是一种检测是否发送了格式错误的数据包的好方法。无论出于何种原因,它都不会捕捉插座在远端关闭的情况。在这种情况下,您将陷入@alk所指的情况。我不确定这是一个性能方面有多好的解决方案。只等一秒钟会严重影响性能,但你不能保证在这段时间内收到苹果的回音。@MartinKonecny:没错。在我的情况下,结果很好,因为我发送了大量货物。不过,我不确定是否还有其他解决方法。我认为更好的方法是使用两个线程,一个用于向套接字写入,另一个用于侦听。侦听线程将使用
选择
来侦听套接字列表,并返回准备读取的套接字的子集。请看这里: