我有一个用python编写的服务器-客户端应用程序。一切工作正常,但我想使服务器成为多线程服务器,并且一切都崩溃了。
这是服务器代码的一部分:
host = 'localhost'
port = 10001
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
class ClientThread(threading.Thread):
def __init__(self, ip, port, socket):
print '5'
threading.Thread.__init__(self)
self.ip = ip
self.port = port
self.socket = socket
print "[+] New thread started for "+ip+":"+str(port)
def __run__(self):
while True:
try:
#conn, addr = sock.accept()
print >>sys.stderr, "Connection from : "+ip+":"+str(port)
print '6'
#reqCommand = conn.recv(1024)
reqCommand = self.recv(1024)
print '7'
command = reqCommand.split(' ', 1) # get <<filename>>
print '8'
reqFile = command[1] # takes the name of the file
reqCommand = command[0]
print '9'
encFile = reqFile + "_enc"
print >>sys.stderr, 'Client> %s' % (reqCommand)
if (reqCommand == 'get'):
pass
try:
os.remove(encFile) # removes the encrypted file
except OSError, e:
print ("Error: %s - %s." % (e.filename,e.strerror))
print >>sys.stderr, 'successfully finished'
print >>sys.stderr, 'waiting for new connections...'
finally:
# clean up connection
self.close()
while True:
sock.listen(4)
print "\nListening for incoming connections..."
(conn, (ip, port)) = sock.accept()
print '1'
newthread = ClientThread(ip, port, conn)
print '2'
newthread.start()
print '3'
threads.append(newthread)
print '4'
当我输入客户端:“ get”时,它将消息发送到客户端,但没有收到任何回信。如您所见,在服务器中,我有很多打印品可以查看崩溃的位置。它按以下顺序打印:1 5 2 3 4. +它还打印[+]新线程...
您还可以看到,我使用了self.recv而不是conn.recv(这是我在stackoverflow上找到的一个解决方案,但是没有用)
有人知道我在做什么错吗?我再次提到,在添加线程和ClientThread类之前,一切正常。提前致谢!
您在显示的代码中有很多错误。
例如,self.recv(1024)
应该用self.socket.recv(1024)
和self.close()
替换self.socket.close()
?(因为它self
是ClientThread / Thread的实例,而不是套接字)。我也认为run方法应该命名为run
(而不是__run__
),如果您close()
在run()
第二次while True
执行后终于执行了连接,则该连接将已经关闭。
除此之外,缺少大块,例如所有导入,以及对bind()的调用-例如 sock.bind((socket.gethostname(), port))
除此之外,并假设所有这些错误都是固定的,看来它应该做应该做的事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句