2012-03-23 11 views
0

以下は、HTTP要求のためにポートで待機し、要求パケットをポート80で実行されているサーバーに送信するコードです。データをクライアントに返します。今、すべてが正常に実行されるが、次のコード行: sock.recv()はPythonコードで実行するのに時間がかかりすぎています

data = req_soc.recv(1024) 
は、実行するためにあまりにも多くの時間を取っていると私は、それは/最後のパケットを受信したために起こっているときに実行するために長い時間がかかることを観察しました。私も select.select()を使って同じコードを試しましたが、結果は同じです。クライアントと実際のHTTPサーバーから来るデータ(未処理)を処理したいので、ソケットを使用する以外に選択肢はありません。

import socket 
import thread 

def handle_client(client): 
    data = client.recv(512) 
    request = '' 
    request += data 
    print data 

print '-'*20 
spl = data.split("\r\n") 

print spl[0] 
print spl[1] 

if len(request): 
    req_soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    req_soc.connect(('localhost', 80)) 
    req_soc.send(request) 

    response = '' 
    data = req_soc.recv(1024) 
    while data: 
     response += data 
     print 1 
     data = req_soc.recv(1024) 
    req_soc.close() 
    print response 
    if len(response): 
     client.send(response) 
client.close() 

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server.bind(('localhost', 4422)) 
server.listen(5) 

print("Server is running...\n") 

MSGLEN = 1024 

while 1: 

    client, address = server.accept() 
    thread.start_new_thread(handle_client, (client,)) 

答えて

0

クライアントは1つの接続内で複数のコマンド(例:GET)を実行できます。あなたが返すものに基づいてより多くのものを要求することができるので(例えば、ウェブページの画像)、クライアントがすべてのコマンドを送るのを待つことはできません。リクエストのパーツ(コマンド)を解析し、境界を見つけてそのリクエストをサーバーに転送し、クライアントに返答を書き戻す必要があります。これはすべて、クライアントの読み込みを妨げない方法で行われます。

pythonでこれを行う最良の方法はわかりませんが、5分のグーグルで過ごすと完全なHTTPプロキシライブラリが見つかります。

+0

これは私のプロジェクトなので、私はライブラリを使用できません。私はソケットを使ってそれをする必要があります。また、クライアントからリクエストを受け取ったときに、一度に1つのHTTP GETリクエストを取得しています。 – vedarthk

+0

あなたのクライアントは、メッセージ全体を送信した後にソケット上の書き込みシャットダウンを行う必要があります。そうでなければ、あなたのrecvはブロックされ続けます...私はあなたが*ライブラリ*を使うべきだと言っていないことに注意してください。ソース* –

+0

OK。誤解をおかけして申し訳ありません。 – vedarthk

関連する問題