python中的多线程服务器

2024-10-01 00:25:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用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。+它还打印[+]个新线程。。。你知道吗

你也可以看到我用过自我接收而不是连接接收(这是我在stackoverflow上找到的解决方案,但不起作用)

有人知道我做错了什么吗?我再次提到,在添加线程和ClientThread类之前,一切都很好。提前谢谢!你知道吗


Tags: selfip服务器for客户机portstderrsys
1条回答
网友
1楼 · 发布于 2024-10-01 00:25:47

显示的代码中有很多错误。你知道吗

例如self.recv(1024)应该被self.socket.recv(1024)替换,而self.close()应该被self.socket.close()替换?(因为self是ClientThread/Thread的实例,而不是socket)。 我还认为run方法应该只命名为run(而不是__run__),如果您在finally in run()中执行close(),那么第二次执行while True时,连接将已经关闭。你知道吗

除此之外,还缺少大块,例如所有导入,以及对bind()的调用—例如sock.bind((socket.gethostname(), port))

除此之外,假设所有这些错误都已修复,它似乎应该做它应该做的事情。你知道吗

相关问题 更多 >