Blog / 阅读

史上最简单的带流控功能的http server

by admin on 2014-05-09 21:38:29 in ,



s.py
[python] view plaincopy
import time  
import SimpleHTTPServer  
import SocketServer  
  
BYTES_PER_SECOND=160*1024  
  
class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):  
    def do_GET(self):  
        """Serve a GET request."""  
        f = self.send_head()  
        if f:  
            self.copyfileobj(f, self.wfile)  
            f.close()  
    def copyfileobj(self,fsrc, fdst, length=16*1024):  
        """copy data from file-like object fsrc to file-like object fdst"""  
        count = 0  
        t1 = time.time()  
        while 1:  
            buf = fsrc.read(length)  
            if not buf:  
                break  
            fdst.write(buf)  
            count += len(buf)  
            if count >= BYTES_PER_SECOND:  
                count = 0  
                delay = 1.0 - (time.time() - t1)  
                if delay > 0.0:  
                    time.sleep(delay)  
                t1 = time.time()                  
PORT = 8000  
Handler = MyHTTPRequestHandler  
httpd = SocketServer.TCPServer(("127.0.0.1", PORT), Handler)  
print "serving at port", PORT  
httpd.serve_forever()  




yes,that's it! 总共三十几行代码。BYTES_PER_SECOND用于指定每秒传输的最大字节数。127.0.0.1 是服务器监听的IP。8000为http server监听的端口。
  
这就是为什么写python程序是一种享受的原因。号称battery include的python,人用人爱的python。
 
但是python也由此给人一种误解,只能写功能简单的程序。写不了高大上的程序,其实真的是一种很大的误解。
 
配合上DNS服务器,这个30行的程序可以作为一个不错的升级测试环境。
 
另外,顺便说一句,如果是在linux下面,端口号如果小于1000的话运行程序是要系统权限的,要不然会抛异常。


写评论

相关文章

上一篇:Hibernate 错误解决(TransactionException: Transaction not successfully started)

下一篇:DES加密算法详解- -

评论

写评论

* 必填.

分享

栏目

赞助商


热门文章

Tag 云