0

我刚刚开始使用 python 套接字网络的基础知识。作为理解练习,我一直在尝试散列一个基本服务器,该服务器将向其客户端询问文件类型,并在收到扩展名字符串后,询问实际文件。我在网上找到了许多使用 asyncore 库的教程,特别是 asynchat 来设置这种调用和响应功能。

我一直在关注的最基本的可以在这里找到(我已经复制了它)

http://effbot.org/librarybook/asynchat.htm

import asyncore, asynchat
import os, socket, string

PORT = 8000

class HTTPChannel(asynchat.async_chat):

    def __init__(self, server, sock, addr):
        asynchat.async_chat.__init__(self, sock)
        self.set_terminator("\r\n")
        self.request = None
        self.data = ""
        self.shutdown = 0

    def collect_incoming_data(self, data):
        self.data = self.data + data

    def found_terminator(self):
        if not self.request:
            # got the request line
            self.request = string.split(self.data, None, 2)
            if len(self.request) != 3:
                self.shutdown = 1
            else:
                self.push("HTTP/1.0 200 OK\r\n")
                self.push("Content-type: text/html\r\n")
                self.push("\r\n")
            self.data = self.data + "\r\n"
            self.set_terminator("\r\n\r\n") # look for end of headers
        else:
            # return payload.
            self.push("<html><body><pre>\r\n")
            self.push(self.data)
            self.push("</pre></body></html>\r\n")
            self.close_when_done()

class HTTPServer(asyncore.dispatcher):

    def __init__(self, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.bind(("", port))
        self.listen(5)

    def handle_accept(self):
        conn, addr = self.accept()
        HTTPChannel(self, conn, addr)

#
# try it out

s = HTTPServer(PORT)
print "serving at port", PORT, "..."

我的问题与班级的handle_accept方法有关HTTPServer。如果每次有请求进来,HTTPChannel对象都会被初始化,这样的设置是不是不可能创建调用和响应?_hastype我在想一个人可以为和设置标志_hasfile在通道对象中,但由于接受为每个单独的连接初始化它,因此每个单独的请求都会忘记对象的状态。我意识到这个设置应该是一个基本的 HTTPServer,但我的问题是,我如何编辑它来设置像我所描述的那样?服务器对象是否需要继承 asynchat 本身并完全放弃调度程序?通道对象必须有一些状态才能知道文件类型已经发送,然后请求文件的二进制文件。我很想知道最干净的实现可能是什么样子。

非常感谢 - 我对套接字很陌生。如果我不清楚,请告诉我。

4

1 回答 1

1

通常,连接在最初创建后会保持打开状态,因此来自同一个客户端的所有通信部分都转到同一个HTTPChannel对象 -accept只有在创建新连接时才会调用。

于 2011-07-18T15:39:20.447 回答