博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第一个“服务器”
阅读量:6813 次
发布时间:2019-06-26

本文共 1663 字,大约阅读时间需要 5 分钟。

hot3.png

如何自己实现一个最简单web的服务器呢? 首先,你必须允许外部IP来访问你的IP,并开启一个端口不断的去监听他,python已经有模块实现这样的API供我们监听端口

import BaseHTTPServerserverip=(' ',8080)server=BaseHTTPServer.HTTPServer(serverip,RequestHandler)server.server_forever()

其中RequestHandler表示需要处理的连接,我们说一般最常见的连接时HTTP协议,我们知道HTTP协议中通过请求的方法有两种:GET和POST,这里以GET为例。

def do_GET(self):       self.send_response(200)       self.send_header('content-type','html/txt')

在这里你可以添加想发送的头的关键字和值。然后就是发送请求得到的应答的内容了。 输入图片说明 这里是相关的请求说明

self.wfile.write(content)

到这里其实发送一个应答任务已经完成了,但是为了保证传输的质量,所以要对输入进行过滤。

full_path=os.getcwd()+self.pathif not os.path.exists(full_path):    raise Exception("{0} is no found".format(self.path))elif os.path.isfile(full_path):    self.handler_file(full_path)else:    raise Exception("unknow  error is {0}".format(self.path))except Exception as msg:    handle_error(self,msg)

这些基本功能保证了请求的规范性,但是对于代码的维护性还是不够,这里可以对每一种错误也转换成类的方式,比如:

class case_no_file(object):    def test(self,handler):        return os.path.exists(handler.full_path)     def act(self,handler):        raise Exception("{0} no found ".format(handler.full_path))

最后再来说下CGI吧,如果想在服务器里添加新的内容该怎么办?直接修改源码那会很麻烦,所以就用到CGI来实现。比如我想增加时间输出的标签该怎么办?先新建一个python文件:time.py

from datetime import datetimeprint '''\

Generated {0}

'''.format(datetime.now())

然后只要把这个的输出发送给服务器就可以了。

import subprocessclass case_cgi(object):    def test(self,handler):        return os.path.isfile(handler.full_path) and handler.full_path.endwith('.py')    def act(self,handler):        run_cgi(handler)    def run_cgi(self,handler):        data=subprocess.check_output(['python',handler.full_path])        handler.send_message(data)

OK,这个就是服务器了。虽然是练手,但是细节还是有的。

转载于:https://my.oschina.net/u/2241389/blog/887921

你可能感兴趣的文章
超级详细Tcpdump 的用法
查看>>
JAVA的String 类
查看>>
Android LayoutInflater学习
查看>>
C# GIZP解码
查看>>
Java并发编程:并发容器之ConcurrentHashMap(转载)
查看>>
Java ConcurrentModificationException异常原因和解决方法
查看>>
traceroute
查看>>
使用FileUpload控件上传文件时对文件大小的限制
查看>>
C#线程系列讲座(1):BeginInvoke和EndInvoke方法
查看>>
马的日字走法和knight是同意类型的。
查看>>
Web.config自定义节点configSections
查看>>
codility上的问题 (23)Chi 2012
查看>>
sort uniq妙用
查看>>
用2263份证件照图片样本测试how-old.net的人脸识别
查看>>
递归控件以加入JS方法
查看>>
PHP面试题(English)
查看>>
[转]Git详解之六 Git工具
查看>>
MVC验证13-2个属性至少输入一项
查看>>
Delphi跨平台下的GetTickCount,GetCurrentThreadID
查看>>
得到目录大小
查看>>