HTTPプロトコル(302ステータス)

友達から質問を受けて少し勉強しました。ソケット通信は最近あんまりつかってなかったので再度勉強した。

ソケット通信でサーバ側でやることは

  1. ソケットの生成
  2. bind
  3. listen
  4. acept
  5. 送受信処理

です。

こんな感じのソース書いた。

#-*- 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サーバとかにできるかも。