【问题标题】:multithreaded server in pythonpython中的多线程服务器
【发布时间】:2015-10-26 21:18:52
【问题描述】:

我有一个用 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 类之前一切正常。提前致谢!

【问题讨论】:

标签: python multithreading server


【解决方案1】:

显示的代码中有很多错误。

例如self.recv(1024) 应该替换为self.socket.recv(1024)self.close() 应该替换为self.socket.close()? (因为self 是ClientThread/Thread 的实例,而不是套接字)。 我也认为运行方法应该命名为run(而不是__run__),如果你在run()的finally中执行close()while True第二次执行,连接将已经关闭。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2020-01-29
    • 1970-01-01
    • 2018-01-23
    • 2013-02-11
    • 2017-03-05
    相关资源
    最近更新 更多