私はちょうど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自体を継承し、ディスパッチャーを完全に無視する必要がありますか?チャネルオブジェクトは、ファイルタイプがすでに送信されたことを知るために何らかの状態を持っていなければならず、その代わりにファイルのバイナリを尋ねる必要があります。私は、これが最もきれいに実行できるかどうかを知ることは非常に興味があります。
ありがとうございます - 私はソケットにはとても新しいです。私が明確でないかどうか教えてください。
したがって、2人の間のすべての送信にacceptが実行されませんか?私はこの方法を誤解しているようだ。どのような条件で接続が終了しますか? – DeaconDesperado
私は間違ったことを見つけたと思います...私はクライアントが各送信の後にソケットで接続を閉じるようにしました。私はこのことを、全体ではなく「議論」の一部分を終わらせることを意味すると誤解しました。あなたの指導に感謝します! – DeaconDesperado