我正在为学校建立一个小的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()
答案 0 :(得分:3)
您应该做的是使用单个请求(即在s.accept()
行返回之后)将服务器线程捕获的时间保持在最低限度。一种常见的方法是在那之后直接生成一个线程,然后再单独处理请求。然后你可以直接返回等待下一个请求(即accept
),而不会被另一个线程中正在进行的处理暂停。
我还建议您查看socketserver模块,因为它已经在更高级别上提供了您。您只需为连接定义处理程序,然后使用该处理程序创建服务器,并使服务器“serve forever”。
答案 1 :(得分: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 Documentation
我还会研究一个线程池,因为在它没有给你带来任何好处之前你只能拥有这么多线程,或者如果可能的话,一个提供服务器功能的框架你必须编写业务逻辑,你的情况是发送文件。