HTTPプロトコル(302ステータス)
友達から質問を受けて少し勉強しました。ソケット通信は最近あんまりつかってなかったので再度勉強した。
ソケット通信でサーバ側でやることは
- ソケットの生成
- bind
- listen
- acept
- 送受信処理
です。
こんな感じのソース書いた。
#-*- coding: utf-8 -*- import socket import threading class ClientThread(threading.Thread): def __init__(self, soc): super(ClientThread, self).__init__() self.soc = soc def run(self): self.recv() self.response() ################################### # 受信データを切れ目まで読み飛ばす def recv(self): while True: data = self.soc.recv(1024) if ((data == '\r\n') or (data == '\n)')): break; if ('\r\n\r\n' in data): break # print "server:receive '%s'" % data ################################### # 302レスポンスをかえす def response(self): self.soc.send("HTTP/1.1 302 Found" + "\r\n") self.soc.send("Location: http://www.google.co.jp/" + "\r\n") self.soc.send("\r\n") class Server(object): def __init__(self, host, port): self.host = host self.port = port def createServerSocket(self): self.server_soc = socket.socket( socket.AF_INET, socket.SOCK_STREAM) self.server_soc.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.server_soc.bind((self.host, self.port)) print(u"Bind %s:%d" %(self.host, self.port)) def acceptLoop(self): self.server_soc.listen(5) (client_soc, client_address) = self.server_soc.accept() clientThread = ClientThread(client_soc) clientThread.start() if __name__ == '__main__': server = Server('localhost', 60000) server.createServerSocket() server.acceptLoop()
もう少しちゃんと改造すれば、簡易HTTPサーバとかにできるかも。