0

我试图在一个单独的线程上创建一个 httpserver,如果在 url 中传递了一个参数,它应该处理一个 get 请求并关闭。

import sys
import threading
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler

class WebServer(SimpleHTTPRequestHandler,threading.Thread):
    port = 9000
    protocol_version = "HTTP/1.1"
    code = ""        
    httpd = None
    isRunning = False
    def do_GET(self):
        self.send_response(200)
        self.send_header("Content-type","text/html")
        self.end_headers()
        self.wfile.write("webpage")
        try:
            self.code = split(self.path,"=")[1]
        except:
            pass
        else:
            self.isRunning=False
            self.stop()            
    def do_POST(self):
        pass
    def __init__(self,port=9000):
        threading.Thread.__init__(self)
        self.port=port
    def run(self):
        while True:
            server_address = ("127.0.0.1",self.port)
            try:
                self.httpd = BaseHTTPServer.HTTPServer(server_address,WebServer)
            except:
                self.port +=1
            else:
                break
        self.isRunning=True
        self.httpd.serve_forever()

server = WebServer(1)
server.start()
while(server.isRunning==False):
    pass
print "Server running on port: %d" %(server.port)
server.join()
print "code: "+server.code

但是向它发送请求时会发生错误:

Server running on port: 1025
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 56462)
Traceback (most recent call last):
  File "/usr/lib/python2.7/SocketServer.py", line 295, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 321, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
TypeError: __init__() takes at most 2 arguments (4 given)
----------------------------------------

当使用 curl 连接到服务器时,它给出了这个错误:

curl: (52) Empty reply from server 
4

1 回答 1

4

你试图用一个班级做太多的事情。

SimpleHTTPRequestHandler 的工作方式是 BaseHTTPServer 创建一个新实例来处理每个请求。它通过调用构造函数来做到这一点。但是您添加了一个新的构造函数,用于创建服务器本身。

明白了吗?

当 BaseHttpServer 接收到请求时,它会获取 WebServer 类(您将其作为 SimpleHTTPRequestHandler 的子类传入,您可以在其中创建 self.httpd)并尝试创建一个实例。它期望 SimpleHTTPRequestHandler 子类的构造函数有四个参数,但是您添加了一个新的构造函数,它只需要两个参数(并且旨在创建一个 Web 服务器,而不是一个处理程序)。

这很奇怪,因为您可能不习惯创建新实例。但这就是它的工作原理。

所以将您的服务器和您的请求处理程序分成两个单独的类(如 kichik 所说)。

于 2013-07-14T23:11:56.747 回答