首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >asyncores的handle_close持续不断地发射

asyncores的handle_close持续不断地发射
EN

Stack Overflow用户
提问于 2015-08-20 03:52:30
回答 1查看 156关注 0票数 0

self.handlers.append(ConnHandler(sock,self.handlers))我是python的新手,我试着写一个简单的套接字服务器来测试并更好地了解这门语言。

代码语言:javascript
复制
import asyncore
import socket
import json

class ConnHandler(asyncore.dispatcher_with_send):

    def __init__(self, conn, handlerlist):
        asyncore.dispatcher_with_send.__init__(self, conn)
        self.handlers = handlerlist

    def handle_close(self):
        self.close()
        print 'Socket closed'
        if(self.handlers.count(self) > 0):
            self.handlers.remove(self);

    def handle_read(self):
        data = ''
        more = True
        while more:
            try:
                data += self.recv(1024)
            except socket.error, e:
                more = False

        if data == '':
            return

        try:
            message = json.loads(data)
        except ValueError:
            self.send('Invalid JSON\n')
            return

        print message


class TestServer(asyncore.dispatcher):

    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((host, port))
        self.listen(5)
        self.handlers = []

    def handle_accept(self):
        pair = self.accept()
        if pair is not None:
            sock, addr = pair
            print 'Incoming connection from %s' % repr(addr)
            self.handlers.append(ConnHandler(sock, self.handlers))

    def sendToAll(self, string):
        for h in self.handlers:
            h.send(string + '\n')

server = TestServer('localhost', 55555)
asyncore.loop()

我的问题如下。如果我使用telnet连接到服务器,然后退出telnet以关闭连接,python只会在终端中发送垃圾邮件“Socket close”。我该如何解决这个问题呢?上面的代码中有没有明显的初学者错误?

EN

回答 1

Stack Overflow用户

发布于 2015-08-20 04:19:05

handle_close不是用来检测对等设备是否断开连接的,如果.recv调用返回空字符串,则可以在handle_read中获得此信息。然后您可以关闭套接字,然后调用handle_close

以下是代码的修改版本:

代码语言:javascript
复制
def handle_close(self):
    print 'Socket closed'
    if(self.handlers.count(self) > 0):
        self.handlers.remove(self);

def handle_read(self):
    data = ''
    more = True
    while more:
        try:
            new_data = self.recv(1024)
            if not new_data:
                self.close()
                return
            else:
                data += new_data
        except socket.error, e:
            more = False

    if data == '':
        return

    try:
        message = json.loads(data)
    except ValueError:
        self.send('Invalid JSON\n')
        return

    print message
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32104462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档