簡體   English   中英

python中的多線程服務器

[英]multithreaded server in 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. +它還打印[+]新線程...

您還可以看到我使用了self.recv而不是conn.recv(這是我在stackoverflow上找到的一個解決方案,但是它沒有用)

有人知道我在做什么錯嗎? 我再次提到,在添加線程和ClientThread類之前,一切正常。 提前致謝!

顯示的代碼中有很多錯誤。

例如self.recv(1024)應該替換成self.socket.recv(1024) ,而self.close()替換成self.socket.close() (因為self是ClientThread / Thread的實例,而不是套接字)。 我也認為run方法應該命名為run (而不是__run__ ),如果您在run() while True第二次while True final in run()run() close() ,則連接將已經關閉。

除此之外,缺少大塊,例如所有導入,以及對bind()的調用-例如類似sock.bind((socket.gethostname(), port))

除此之外,並假設所有這些錯誤都是固定的,看來它應該做應該做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM