1

我正在为学校构建一个小的 Python 服务器脚本,它必须读取文件并将其发送到客户端。

现在,我需要服务器同时响应来自客户端的多个请求。目前它只接受 1 个客户......并且在客户被回答后,它会移动到下一个。

我的老师告诉我使用多个进程/线程来实现这一点。我是 Python 新手,所以我不知道如何管理它。

我怎样才能做到这一点?

这是我的代码:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((host,port)) 
s.listen(backlog) 
while 1:
    print "server ready, waiting..."
    client, address = s.accept() 
    print "recvd client", address 
    data = client.recv(size) 
    if data:

        parametro_data = data.split(' ')
        if(parametro_data[0] == '/GET'):

            theFile = parametro_data[1].replace('\r\n','')

            if os.path.isfile(theFile):
                f = open(theFile, 'r')
                for line in f:
                    client.send(line)
                f.close()
            else:
                client.send("File not exists")

    client.close()
4

2 回答 2

3
于 2012-12-14T20:24:43.973 回答
0

要在您描述的模型中处理此问题,您将取出执行实际文件发送的代码并将其封装在线程中。

class HandleClient( threading.Thread ):
 def __init__( self, clientSocket, file_to_read ):
  ...setting up the thread object...
 def run( self ):
  ...sending code...

这将发送文件,以便您的主接受线程能够处理其他客户端。

因此,您的客户流程如下:

新客户端连接 -> 接受连接 -> 创建新的线程对象并调用start()方法 -> 线程将文件发送到该客户端,然后关闭连接。

线程文档

threading.Thread 文档

我还将研究一个线程池,因为您一次只能拥有这么多线程,否则它不会给您带来任何好处,或者如果可能的话,是一个提供服务器功能的框架,您只需要编写业务逻辑,在您的情况下文件的发送。

于 2012-12-14T20:20:48.710 回答