私はソケットを初めて使用しています。私は単純な「プロキシ」サーバーをPythonで書いています。このサーバーはリモートサーバーからデータを取得してクライアント(ブラウザ)に送信します。私は思っていた:time.sleepなしでresponse_textを送信する方法はありますか?私はtime.sleep(0.5)
を削除しようとしていますが、私は 'Content-lenght'がパッケージの長さと等しくないように、リモートサーバから1つのデータパッケージを取得するだけで、エラーが出ます(私はrecv() buffer_sizeに等しいサイズのバッファです。したがって、サーバーデータに1つの4096バイトのパッケージが必要な場合は、次のパッケージでそれをキャッチする必要があります)。 time.sleepでは、リモートサーバーからすべてのデータパッケージを取得し、ブラウザにデータを送信できます。私は何か間違っているのですか?それとも私は十分知らないのですか?助けてもらえますか?ソケットPythonからのデータ受信時にスリープ状態にする必要がありますか?
コード:
# coding: utf-8
import socket
import sys
import time
from thread import *
max_conn = 5
buffer_size = 4096
def proxy_server(webserver, port, conn, addr, data):
try:
remote_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
remote_sock.connect((webserver, port))
remote_sock.send(data)
response_text = ''
while True:
time.sleep(0.5)
response = remote_sock.recv(buffer_size)
response_text += response
if len(response) < buffer_size:
remote_sock.close()
break
conn.sendall(response_text)
conn.close()
except socket.error, msg:
print 'Proccessing error. Error Code: ' + str(msg[0]) + ', Wiadomość: ' + msg[1]
remote_sock.close()
conn.close()
sys.exit()
def conn_string(conn, data, address):
header = data.split('\r\n')
method, address, protocol = header[0].split(' ')
host_key, host_value = header[1].split(': ')
proxy_server(host_value, 80, conn, address, data)
def start():
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', 8001))
sock.listen(max_conn)
print 'Proxy: on'
except socket.error, msg:
print 'Failed creating a socket. Error Code: ' + str(msg[0]) + ', Wiadomość: ' + msg[1]
sys.exit()
while True:
try:
connection, address = sock.accept()
data = connection.recv(buffer_size)
# start_new_thread(conn_string, (connection, data, address))
conn_string(connection, data, address)
except KeyboardInterrupt:
sock.close()
print "Socket closed"
sys.exit()
if __name__ == "__main__":
start()
コンテンツ長のヘッダーがある場合は、正確なバイト数がrecvされるまで、属性の値を使用してsocket recvをループオーバーします。 –