select() 関数 - I/O 多重化を使用して、Python で Web サーバーを構築しています。私の場合は Web ブラウザー (サファリ、クロム、Firefox) である複数のクライアントに接続し、各クライアントの HTTP 1.1 GET 要求を受け入れることができます。リクエストを受け取ったら、html ページが表示されているブラウザに html ページのコンテンツを返します。
私が得ている問題は、接続をしばらく開いたままにしようとしたときです。fd.close() を使用して接続を閉じるまで、ブラウザーに何も表示できないことに気付きました。
これは、ブラウザのリクエストを受け入れて応答するために使用している関数です。問題は、fd.sendall() を使用した後です。接続を閉じたくないのですが、閉じるまでページが表示されません。助けてください!どんな助けや提案も大歓迎です..
def handleConnectedSocket():
try:
recvIsComplete = False
rcvdStr = ''
line1 = "HTTP/1.1 200 OK\r\n"
line2 = "Server: Apache/1.3.12 (Unix)\r\n"
line3 = "Content-Type: text/html\r\n" # Alternately, "Content-Type: image/jpg\r\n"
line4 = "\r\n"
line1PageNotFound = "HTTP/1.1 404 Not Found\r\n"
ConnectionClose = "Connection: close\r\n"
while not recvIsComplete:
rcvdStr = fd.recv( 1024 )
if rcvdStr!= "" :
# look for the string that contains the html page
recvIsComplete = True
RequestedFile = ""
start = rcvdStr.find('/') + 1
end = rcvdStr.find(' ', start)
RequestedFile = rcvdStr[start:end] #requested page in the form of xyz.html
try:
FiletoRead = file(RequestedFile , 'r')
except:
FiletoRead = file('PageNotFound.html' , 'r')
response = FiletoRead.read()
request_dict[fd].append(line1PageNotFound + line2 + ConnectionClose + line4)
fd.sendall( line1PageNotFound + line2 + line3 + ConnectionClose + line4 + response )
# fd.close() <--- DONT WANT TO USE THIS
else:
response = FiletoRead.read()
request_dict[fd].append(line1 + line2 + line3 + ConnectionClose + line4 + response)
fd.sendall(line1 + line2 + line3 + line4 + response)
# fd.close() <--- DONT WANT TO USE THIS
else:
recvIsComplete = True
#Remove messages from dictionary
del request_dict[fd]
fd.close()
クライアント (ブラウザー) 要求は、次に示すように HTTP 1.1 形式です。
GET /Test.html HTTP/1.1
Host: 127.0.0.1:22222
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: keep-alive