import socket
import sys
import binascii
import datetime
import time
try:
port = 2122
host = ''
except IndexError:
print ("Error: ")
print ("Be sure to specify username, password, port, database name and table name.\n")
print ("Syntax: ./script.py username password port db_name table_name.")
print ("Example: ./script.py hank mypass 8762 testdb test_table")
print ("\nExit...")
sys.exit(1)
while 1:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
s.listen(5)
c, addr = s.accept()
print ('Connected by', addr)
data = c.recv(1042)
s=binascii.hexlify(data)
print(s)
data = None
c.close()
time.sleep(1)
print('Exited!')
以上是我在无限循环中的编码,以保持倾听客户端, 等待客户端发送数据并打印出来。就这样。 这种写法会不会引起内存泛滥?因为保持打开套接字并用无限循环关闭!。
P / S:我试过绑定并监听套接字,只用.recv循环,但它不起作用。只能接收一次数据。
答案 0 :(得分:1)
如果“内存溢出”是指“内存泄漏”,那么不,这里没有内存泄漏。
每次循环时,一旦重新分配s
和c
,就没有其他对先前值的引用,因此它们将被垃圾回收。在CPython中,这应该立即发生;在其他实现中(PyPy,Jython,IronPython),它将在某个不可预测的点发生。
但是,您可能会遇到文件句柄问题。那个“一些不可预知的点”是由你需要清理内存所驱动的。如果您有其他资源需要比内存更积极地清理,您不能依赖GC来为您完成。而套接字(文件句柄)就是这样一种资源。您不希望在未使用的地方放置25000个插槽,因为它们仅使用500KB内存,因此GC未触及。
每次循环都显式调用c.close()
;你应该为s
做同样的事情。或者,更好的是,使用with:
块。
所有这一切,这是一个非常奇怪的设计;只是因为它没有泄漏记忆并不意味着它是你真正想做的事情。