2011-07-18 9 views
0

私はちょうどpythonソケットネットワーキングの基礎を学び始めました。理解の練習として、私はファイルタイプのクライアントであることを尋ねる基本的なサーバーをハッシュアウトしようとしていました。そして、拡張子の文字列を受け取ったら、実際のファイルを要求します。私はasyncoreライブラリを使用する多数のチュートリアルをオンラインで見つけました。特に、この種の呼び出しと応答機能をセットアップするためのasynchatです。python 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, "..." 

私の質問はHTTPServerクラスのhandle_accept方法に関係しています(私はそれをコピーしました)。要求が到着するたびに、HTTPChannelオブジェクトが初期化されます。この種のセットアップでは、呼び出しと応答を作成することは不可能でしょうか?私はチャネルオブジェクトに_hastype_hasfileのフラグを設定できると考えていましたが、受け入れは個々の接続ごとにそれを挿入するので、個々の要求ごとにオブジェクトの状態は忘れてしまいます。私はこのセットアップが基本的なHTTPServerであるはずですが、私の質問は、私が記述したようなものをセットアップするためにそれをどのように編集できるのでしょうか?サーバーオブジェクトはasynchat自体を継承し、ディスパッチャーを完全に無視する必要がありますか?チャネルオブジェクトは、ファイルタイプがすでに送信されたことを知るために何らかの状態を持っていなければならず、その代わりにファイルのバイナリを尋ねる必要があります。私は、これが最もきれいに実行できるかどうかを知ることは非常に興味があります。

ありがとうございます - 私はソケットにはとても新しいです。私が明確でないかどうか教えてください。

答えて

1

通常、接続が最初に作成された後は開いたままになるため、同じクライアントからの通信のすべての部分が同じHTTPChannelオブジェクトに移動します。新しい接続が作成されるときにのみ呼び出されます。accept

+0

したがって、2人の間のすべての送信にacceptが実行されませんか?私はこの方法を誤解しているようだ。どのような条件で接続が終了しますか? – DeaconDesperado

+0

私は間違ったことを見つけたと思います...私はクライアントが各送信の後にソケットで接続を閉じるようにしました。私はこのことを、全体ではなく「議論」の一部分を終わらせることを意味すると誤解しました。あなたの指導に感謝します! – DeaconDesperado

関連する問題