Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 如何在除KeyboardInterrupt:在类之外时使用sock.close()正常关闭套接字_Python_Sockets - Fatal编程技术网

Python 如何在除KeyboardInterrupt:在类之外时使用sock.close()正常关闭套接字

Python 如何在除KeyboardInterrupt:在类之外时使用sock.close()正常关闭套接字,python,sockets,Python,Sockets,给定这部分代码,当按下Ctrl+C时,程序返回错误“未定义名称'sock'。我想这是正常的,因为sock.close()在类之外,但是我应该怎么做来防止它呢 在我的例子中,请求套接字关闭的是客户机,而不是服务器 import socket class something(object): def connect(self): self.sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM) se

给定这部分代码,当按下Ctrl+C时,程序返回错误“未定义名称'sock'。我想这是正常的,因为
sock.close()
在类之外,但是我应该怎么做来防止它呢

在我的例子中,请求套接字关闭的是客户机,而不是服务器

import socket

class something(object):
    def connect(self):
        self.sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
        self.sock.connect((self.tcp_ip, self.tcp_port))
        # etc.

if __name__ == '__main__':
    try:
        app = something()
        app.connect()
    except KeyboardInterrupt:
        pass
    finally:
        sock.close()
试试这个

if __name__ == '__main__':
    try:
        foo = something()
        foo.connect()
    except KeyboardInterrupt:
        pass
    finally:
        foo.sock.close()

我想这应该行得通

import socket
class something(object):
    def __init__(self):
        self.sock = None

    def connect(self):
        self.sock = socket.socket( socket.AF_INET, socket.SOCK_STREAM)
        self.sock.connect(('127.0.0.1', 12397))
        self.sock.recv(1024)

    def close(self):
        self.sock.close()

if __name__ == '__main__':
    try:
        sk = something()
        sk.connect()
    except KeyboardInterrupt:
        pass
    finally:
        sk.close()
        print "Socket Closed"

为了很好地关闭与
信号的连接,可以使用
捕捉键盘中断:

#!/usr/bin/env python3
""" testsocketclose.py """
import signal, socket, sys, time

def handler(signum, frame):
    """ Catch <ctrl+c> signal for clean stop"""
    print('\nNice exit')
    connection.close()
    sys.exit(0)

signal.signal(signal.SIGINT, handler)

connection = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
connection.bind(('localhost', 5555))
connection.listen(5)

while 1:
    print("Socket open:\n{}\nExit with <ctrl+c>".format(connection))
    time.sleep(2)
#/usr/bin/env蟒蛇3
“”“testsocketclose.py”“”
输入信号,插座,系统,时间
def处理器(信号、帧):
“”“清洁停止的捕捉信号”“”
打印(“\n即时退出”)
连接。关闭()
系统出口(0)
signal.signal(signal.SIGINT,handler)
连接=socket.socket(socket.AF\u INET,socket.SOCK\u流)
bind(('localhost',5555))
连接。听(5)
而1:
打印(“套接字打开:\n{}\nExit with.”格式(连接))
时间。睡眠(2)

上述代码中的
某物()
的可能重复项将永远不会创建套接字。是否有更多您认为不相关的代码?请包括:)。@-好的,我遗漏了一些东西,谢谢你的指点(我应该在睡眠后才学会在这里发布:)虽然在这个制造的示例中不太可能,但如果
键盘中断
在调用
.connect()
之前出现,这仍然会引发异常。是的,这是公平的。但是,使用键盘中断来关闭套接字可能不是最好的开始。它是由代码组成的,但我认为这样做的目的是允许
Ctrl+C
用于退出程序或其中的一部分,OP希望关闭套接字。我认为这个问题仍然适用于任何其他信号发送方法。当我阅读OP的问题时,我会将其解释为:我如何防止“此代码中未定义名称‘sock’?我想我可能误解了这个问题。是的,这很有效,也是我学习更好地使用
的一个好例子。如果我在
中有一个
close
函数,在
try
下有一个单独的
main()
函数,会怎么样?