1

我编写了一个连接到远程服务器的 python 脚本,并解析返回的响应。出于某种奇怪的原因,10 次中有 9 次,一旦读取了标头,脚本就会继续并在获取响应正文之前返回。我不是 python 专家,但我确定我的代码在 python 方面是正确的。这是我的代码:

class miniclient:
"Client support class for simple Internet protocols."

def __init__(self, host, port):
    "Connect to an Internet server."


    self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.sock.settimeout(30)

    try:
        self.sock.connect((host, port))
        self.file = self.sock.makefile("rb")

    except socket.error, e:

        #if e[0]    == 111:
        #   print   "Connection refused by server %s on port %d" % (host,port)
        raise


def writeline(self, line):
    "Send a line to the server."

    try:
        # Updated to sendall to resolve partial data transfer errors
        self.sock.sendall(line + CRLF) # unbuffered write

    except socket.error, e:
        if e[0] == 32 : #broken pipe
            self.sock.close() # mutual close
            self.sock = None

        raise e

    except socket.timeout:
        self.sock.close() # mutual close
        self.sock = None
        raise

def readline(self):
    "Read a line from the server.  Strip trailing CR and/or LF."

    s = self.file.readline()

    if not s:
        raise EOFError

    if s[-2:] == CRLF:
        s = s[:-2]

    elif s[-1:] in CRLF:
        s = s[:-1]

    return s


def read(self, maxbytes = None):
    "Read data from server."

    if maxbytes is None:
        return self.file.read()

    else:
        return self.file.read(maxbytes)


def shutdown(self):

    if self.sock:
        self.sock.shutdown(1)


def close(self):

    if self.sock:
        self.sock.close()
        self.sock = None

我使用 ReadLine() 方法读取标题,直到到达空行(标题和正文之间的分隔符)。从那里,我的对象只需调用“Read()”方法来读取正文。如前所述,10 次中有 9 次 read 什么都不返回,或者只是部分数据。

示例使用:

try:
    http = miniclient(host, port)

except Exception, e:

    if e[0] == 111:
        print   "Connection refused by server %s on port %d" % (host,port)

    raise

http.writeline("GET %s HTTP/1.1" % str(document))
http.writeline("Host: %s" % host)
http.writeline("Connection: close") # do not keep-alive
http.writeline("")
http.shutdown() # be nice, tell the http server we're done sending the request

# Determine Status
statusCode = 0
status = string.split(http.readline())
if status[0] != "HTTP/1.1":
    print "MiniClient: Unknown status response (%s)" % str(status[0])

try:
    statusCode = string.atoi(status[1])
except ValueError:
    print "MiniClient: Non-numeric status code (%s)" % str(status[1])

#Extract Headers
headers = []
while 1:
    line = http.readline()
    if not line:
        break
    headers.append(line)

http.close() # all done

#Check we got a valid HTTP response
if statusCode == 200:
    return http.read()
else:
    return "E\nH\terr\nD\tHTTP Error %s \"%s\"\n$\tERR\t$" % (str(statusCode), str(status[2]))
4

1 回答 1

2

不正确的答案已删除,但尚未删除(因此评论可以存活一段时间。)

于 2013-07-31T04:35:36.397 回答