套接字服务器 Python
Posted
技术标签:
【中文标题】套接字服务器 Python【英文标题】:SocketServer Python 【发布时间】:2013-09-01 22:42:34 【问题描述】:所以我找到了以下示例代码,它允许在给定的 url 和端口上建立一个基本的 python HTTP 服务器。我对 Web 服务器非常缺乏经验,并且正在尝试为对该服务器的某些 GET 请求创建处理程序。但是,我无法弄清楚如何在远程访问此 URL 时为另一台计算机发出的 GET 请求实际创建处理程序。有什么建议吗?
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
"""
The RequestHandler class for our server.
It is instantiated once per connection to the server, and must
override the handle() method to implement communication to the
client.
"""
def handle(self):
# self.request is the TCP socket connected to the client
self.data = self.request.recv(1024).strip()
print " wrote:".format(self.client_address[0])
print self.data
# just send back the same data, but upper-cased
self.request.sendall(self.data.upper())
if __name__ == "__main__":
HOST, PORT = "url" , PORT
# Create the server, binding to localhost on port 9999
server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()
【问题讨论】:
有更高级别的框架,可以轻松定义要调用的函数,用于某些请求的路径、bottle、flask、django、tornado 那么我将如何在这段代码中实现它们? 【参考方案1】:这是一个非常简单的例子,说明它是如何工作的。你可以开始它并用它来调用它,例如:
curl -i 'http://localhost:5001/foo/bar?foo=bar' -X POST -d '"Foo":"Bar"'
HTTP/1.1 200 OK
Some response%
它缺少 吨 的东西,但这至少应该给你一些想法。
import SocketServer
class MyTCPHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print self.data
self.parse_request(self.data)
func, args = self.path.split("/", 1)
args = args.split("/")
resp = getattr(self, func)(*args)
self.request.sendall("HTTP/1.1 200 OK\n")
self.request.sendall("\n")
self.request.sendall(resp)
def parse_request(self, req):
headers =
lines = req.splitlines()
inbody = False
body = ''
for line in lines[1:]:
if line.strip() == "":
inbody = True
if inbody:
body += line
else:
k, v = line.split(":", 1)
headers[k.strip()] = v.strip()
method, path, _ = lines[0].split()
self.path = path.lstrip("/")
self.method = method
self.headers = headers
self.body = body
self.path, self.query_string = self.path.split("?")
def foo(self, *args):
print self.path
print self.query_string
print self.body
print self.headers
print self.method
return "Some response"
if __name__ == "__main__":
server = SocketServer.TCPServer(("localhost", 5001), MyTCPHandler)
server.serve_forever()
【讨论】:
以上是关于套接字服务器 Python的主要内容,如果未能解决你的问题,请参考以下文章
python python中的套接字服务器使用select函数
Python网络编程利用Python进行TCPUDP套接字编程