首先,我遇到了Python中的套接字并遇到了这个问题:当我的python代码中出现一些错误时,例如在第二个脚本启动端口上的conn.close()
之前的一些语法错误正在使用中。脚本已经完成,但是套接字仍然是打开的,有点像繁忙的套接字。
以下是一个错误:
web@web-X501A1 /var/www $ cd /home/web/www/public/py
web@web-X501A1 ~/www/public/py $ python sockets.py
connected: ('127.0.0.1', 47168)
Traceback (most recent call last):
File "sockets.py", line 164, in <module>
data = re.find('(<onvif>.*<\/onvif>)')
AttributeError: 'module' object has no attribute 'find'
web@web-X501A1 ~/www/public/py $ python sockets.py
Traceback (most recent call last):
File "sockets.py", line 154, in <module>
sock.bind(('', 9090))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use
web@web-X501A1 ~/www/public/py $ python sockets.py
Traceback (most recent call last):
File "sockets.py", line 154, in <module>
sock.bind(('', 9090))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 98] Address already in use
代码:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 9090))
sock.listen(1)
conn, addr = sock.accept()
try:
print 'connected:', addr
buffer = ''
while True:
buffer += conn.recv(1024)
data = re.find('(<code>.*<\/code>)', buffer)
print data
exit();
if not data:
continue
conn.send(data.upper())
except Exception:
pass
finally:
conn.close()
答案 0 :(得分:2)
在try / finally子句中包含套接字的用法。关闭finally
部分中的套接字。也许在except
部分处理异常。类似的东西:
try:
result = x / y
except ZeroDivisionError:
print "division by zero!"
else:
print "result is", result
finally:
print "executing finally clause"
答案 1 :(得分:1)
这里的问题是在没有正确的TCP连接关闭序列的情况下脚本崩溃时发生的脏套接字关闭。值得庆幸的是,这是一个简单的解决方案,它告诉内核忽略套接字已被使用的事实(它被绑定的端口):
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
这就是全部,在绑定调用之前添加它并进行设置。一旦完成,调试其他错误会更简单,更省时;)请参阅文档中的更多内容https://docs.python.org/2/library/socket.html#socket.socket.setsockopt
答案 2 :(得分:0)