1

我正在用 Python 编写服务器,我想在 GET 请求的正文部分发送一些数据。目前,当我运行我的代码时,它只是冻结了。

我试图将它放在 try/except 中并阅读有关实例变量 rfile 的详细信息,但我没有发现任何有用的信息

客户端 :

import http.client
import sys  
import os

#get http server ip  
http_server = sys.argv[1]  
#create a connection  
conn = http.client.HTTPConnection(http_server)  

while 1:  
  cmd = input('input command (ex. GET index.html): ')  
  cmd = cmd.split()  

  f = open('data.txt')

  if cmd[0] == 'exit': #tipe exit to end it  
    break  

  #request command to server  
  conn.request(cmd[0],'',f.read())  

  #get response from server  
  rsp = conn.getresponse()  

  #print server response and data  
  print(rsp.status, rsp.reason)  
  data_received = rsp.read()  
  print(data_received)  

服务器端 :

from http.server import BaseHTTPRequestHandler,HTTPServer
import os

class TestHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        a = ''
        fichier = open("data2.txt", "w")
        try:
            fichier.write(self.rfile.read())
        except:

        self.send_response(200)
        self.send_header('Content-type','text-html')
        self.end_headers()
        return


def run():
    print('http server is starting...')
    server_address = ('127.0.0.1',80)
    httpd = HTTPServer(server_address, PancakeHTTPRequestHandler)
    print('htttp server is running...')
    httpd.serve_forever()

if __name__ == '__main__':
    run()  

我希望能够将我的 GET 请求中的数据写入我的 data2.txt 文件中。

谢谢您的帮助

4

1 回答 1

1

它冻结是因为self.rfile.read()你的 server.py 中的。read 方法期望读取 EOF 或字节长度。请参阅https://docs.python.org/3/library/io.html#io.BufferedIOBase.read 您正在尝试记录客户端对服务器的请求,快速解决方法是将内容长度传递给对 read 方法的请求int(self.headers.get('Content-Length'))

最后它给了我们:

客户端.py

import http.client
import sys  
import os

#get http server ip  
http_server = sys.argv[1]  
#create a connection  
conn = http.client.HTTPConnection(http_server)  

while 1:  
  cmd = input('input command (ex. GET index.html): ')  
  cmd = cmd.split()

  f = open('data.txt')

  if cmd[0] == 'exit': #tipe exit to end it  
    break  

  #request command to server  
  conn.request(cmd[0], '', f.read())  

  #get response from server  
  rsp = conn.getresponse()  

  #print server response and data  
  print(rsp.status, rsp.reason)  
  data_received = rsp.read()  
  print(data_received)  

服务器.py

from http.server import BaseHTTPRequestHandler,HTTPServer
import os

class TestHTTPRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        a = ''
        fichier = open("data2.txt", "a")
        try:
            content_length = int(self.headers.get('Content-Length'))
            response_str = self.rfile.read(content_length)
            fichier.write(response_str.decode('utf-8'))
            self.send_response(200)
            self.send_header("Content-type", "text/html")
            self.end_headers()
        except:
            self.send_response(200)
            self.send_header('Content-type','text-html')
            self.end_headers()
        fichier.close()
        return


def run():
    print('http server is starting...')
    server_address = ('127.0.0.1',80)
    httpd = HTTPServer(server_address, TestHTTPRequestHandler)
    print('htttp server is running...')
    httpd.serve_forever()

if __name__ == '__main__':
    run()  

附言。我不知道 PancakeHTTPRequestHandler 是什么,所以我用 TestHTTPRequestHandler 替换了它。我还在尝试中添加了一个响应,除了在服务器端,以便客户端得到响应,否则它将崩溃。

于 2019-05-17T21:05:10.587 回答