zoukankan      html  css  js  c++  java
  • 史上最简单的带流控功能的http server

    s.py

    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监听的port。

      

    这就是为什么写python程序是一种享受的原因。号称battery include的python,人用人爱的python。

    可是python也由此给人一种误解,仅仅能写功能简单的程序。写不了高大上的程序,事实上真的是一种非常大的误解。

    配合上DNSserver,这个30行的程序能够作为一个不错的升级測试环境。

    另外,顺便说一句,假设是在linux以下,port号假设小于1000的话执行程序是要系统权限的,要不然会抛异常。

  • 相关阅读:
    Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '1288372549423476738' for key 'PRIMARY'
    环形数组循环
    less命令
    ln命令
    Vue中$refs的理解
    cut命令
    除数博弈
    find命令
    file命令
    最长公共前缀
  • 原文地址:https://www.cnblogs.com/yxwkf/p/3855160.html
Copyright © 2011-2022 走看看