【问题标题】:asyncore socket doesn't close properly异步套接字未正确关闭
【发布时间】:2014-09-03 17:59:03
【问题描述】:

我编写了(大部分是复制的)一个非常简单的 python 脚本,用作 xbmc 的来电显示插件。除了关闭套接字外,它按预期工作。我已经确认 xbmc.abortRequested(XBMC 正在关闭的通知)确实设置为 True,因此循环应该结束。但它没有(它似乎挂起)并且 xbmc 在清理过程中大约 5 秒后杀死了脚本。这种不正常的退出不会导致任何问题,但我希望脚本能够正确退出。我不知道我是否可以设置某种其他超时或什么。感谢您的帮助。

道格

我的代码:

import socket, threading, thread, sys, asyncore, xbmc, xbmcgui, xbmcaddon
from time import *
from string import *

xbmc.log("YAC Listener: Starting")
PORT = 10629

class Server(asyncore.dispatcher):
    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.bind((host, port))
        self.listen(1)

    def handle_accept(self):
        socket, address = self.accept()
        ConnectionHandler(socket)

    def handle_close(self):
        self.close()
        xbmc.log("YAC Listener: Closing Port")

class ConnectionHandler(asyncore.dispatcher_with_send):
    def handle_read(self):
        self.buffer = self.recv(1024)
        self.buffer = split(self.buffer[5:], "~")
        self.close()
        global data
        if len(self.buffer) > 1:
            name = self.buffer[0]
            number = self.buffer[1]
                xbmc.executebuiltin("XBMC.Notification("+name+","+number+",7000,special://home/addons/script.yaclistener/phone.png)")
        else:
            data = self.buffer

s = Server('', PORT)

while not xbmc.abortRequested:
    asyncore.loop(timeout=1)

s.close()
sys.exit()
xbmc.log("YAC Listener: Exiting")

【问题讨论】:

    标签: python sockets asyncore


    【解决方案1】:

    “超时”的含义略有不同(大致可以认为是循环粒度)。

    所以最终文件代码应该像下面这样:

    ...
    while not xbmc.abortRequested:
        asyncore.loop(timeout=1, count=1)
    
    # this will try to close ALL current connections:
    asyncore.close_all()
    # this will give some time (up to 5 seconds) for things to settle down:
    asyncore.loop(timeout=1, count=5)
    sys.exit()
    xbmc.log("YAC Listener: Exiting")
    

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 2011-08-04
      • 2012-02-10
      • 2011-01-14
      相关资源
      最近更新 更多