一起写一个Web服务器(3)
admin
2023-07-30 22:24:16
0
  • 一起写一个 Web 服务器(2)
  • 一起写一个 Web 服务器(1)

“发明创造时,我们学得最多” —— Piaget

在本系列第二部分,你已经创造了一个可以处理基本的 HTTP GET 请求的 WSGI 服务器。我还问了你一个问题,“怎么让服务器在同一时间处理多个请求?”在本文中你将找到答案。那么,系好安全带加大马力。你马上就乘上快车啦。准备好Linux、Mac OS X(或任何类unix系统)和 Python。本文的所有源码都能在GitHub上找到。

首先咱们回忆下一个基本的Web服务器长什么样,要处理客户端请求它得做什么。你在第一部分和第二部分创建的是一个迭代的服务器,每次处理一个客户端请求。除非已经处理了当前的客户端请求,否则它不能接受新的连接。有些客户端对此就不开心了,因为它们必须要排队等待,而且如果服务器繁忙的话,这个队伍会很长。

以下是迭代服务器webserver3a.py的代码:

12345678910111213141516171819202122232425262728293031323334 ###################################################################### Iterative server – webserver3a.py                                 ##                                                                   ## Tested with Python 2.7.9 & Python 3.4 on Ubuntu 14.04 & Mac OS X  ######################################################################import socket SERVER_ADDRESS = (HOST, PORT) = \’\’, 8888REQUEST_QUEUE_SIZE = 5 def handle_request(client_connection):    request = client_connection.recv(1024)    print(request.decode())    http_response = b\”\”\”HTTP/1.1 200 OK Hello, World!\”\”\”    client_connection.sendall(http_response) def serve_forever():    listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)    listen_socket.bind(SERVER_ADDRESS)    listen_socket.listen(REQUEST_QUEUE_SIZE)    print(\’Serving HTTP on port {port} …\’.format(port=PORT))     while True:        client_connection, client_address = listen_socket.accept()        handle_request(client_connection)        client_connection.close() if __name__ == \’__main__\’:    serve_forever()

要观察服务器同一时间只处理一个客户端请求,稍微修改一下服务器,在每次发送给客户端响应后添加一个60秒的延迟。添加这行代码就是告诉服务器睡眠60秒。

以下是睡眠版的服务器webserver3b.py代码:

1234567891011121314151617181920212223242526272829303132333435363738 ########################################################################## Iterative server – webserver3b.py                                     ##                                                                       ## Tested with Python 2.7.9 & Python 3.4 on Ubuntu 14.04 & Mac OS X      ##                                                                       ## – Server sleeps for 60 seconds after sending a response to a client   ##########################################################################import socketimport time SERVER_ADDRESS = (HOST, PORT) = \’\’, 8888REQUEST_QUEUE_SIZE = 5 def handle_request(client_connection):    request = client_connection.recv(1024)    print(request.decode())    http_response = b\”\”\”HTTP/1.1 200 OK Hello, World!\”\”\”    client_connection.sendall(http_response)    time.sleep(60)  # sleep and block the process for 60 seconds def serve_forever():    listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)    listen_socket.bind(SERVER_ADDRESS)    listen_socket.listen(REQUEST_QUEUE_SIZE)    print(\’Serving HTTP on port {port} …\’.format(port=PORT))     while Trueyon-o\”>=PORT))     while True81523/\” target=\”_blank\”>一起写一个 Web 服务器(2)

  • 一起写一个 Web 服务器(1)
  • “发明创造时,我们学得最多” —— Piaget

    在本系列第二部分,你已经创造了一个可以处理基本的 HTTP GET 请求的 WSGI 服务器。我还问了你一个问题,“怎么让服务器在同一时间处理多个请求?”在本文中你将找到答案。那么,系好安全带加大马力。你马上就乘上快车啦。准备好Linux、Mac OS X(或任何类unix系统)和 Python。本文的所有源码都能在GitHub上找到。

    首先咱们回忆下一个基本的Web服务器长什么样,要处理客户端请求它得做什么。你在第一部分和第二部分创建的是一个迭代的服务器,每次处理一个客户端请求。除非已经处理了当前的客户端请求,否则它不能接受新的连接。有些客户端对此就不开心了,因为它们必须要排队等待,而且如果服务器繁忙的话,这个队伍会很长。

    以下是迭代服务器webserver3a.py的代码:

    12345678910111213141516171819202122232425262728293031323334 ###################################################################### Iterative server – webserver3a.py                                 ##                                                                   ## Tested with Python 2.7.9 & Python 3.4 on Ubuntu 14.04 & Mac OS X  ######################################################################import socket SERVER_ADDRESS = (HOST, PORT) = \’\’, 8888REQUEST_QUEUE_SIZE = 5 def handle_request(client_connection):    request = client_connection.recv(1024)    print(request.decode())    http_response = b\”\”\”HTTP/1.1 200 OK Hello, World!\”\”\”    client_connection.sendall(http_response) def serve_forever():    listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)    listen_socket.bind(SERVER_ADDRESS)    listen_socket.listen(REQUEST_QUEUE_SIZE)    print(\’Serving HTTP on port {port} …\’.format(port=PORT))     while True:        client_connection, client_address = listen_socket.accept()        handle_request(client_connection)        client_connection.close() if __name__ == \’__main__\’:    serve_forever()

    要观察服务器同一时间只处理一个客户端请求,稍微修改一下服务器,在每次发送给客户端响应后添加一个60秒的延迟。添加这行代码就是告诉服务器睡眠60秒。

    以下是睡眠版的服务器webserver3b.py代码:

    1234567891011121314151617181920212223242526272829303132333435363738 ########################################################################## Iterative server – webserver3b.py                                     ##                                                                       ## Tested with Python 2.7.9 & Python 3.4 on Ubuntu 14.04 & Mac OS X      ##                                                                       ## – Server sleeps for 60 seconds after sending a response to a client   ##########################################################################import socketimport time SERVER_ADDRESS = (HOST, PORT) = \’\’, 8888REQUEST_QUEUE_SIZE = 5 def handle_request(client_connection):    request = client_connection.recv(1024)    print(request.decode())    http_response = b\”\”\”HTTP/1.1 200 OK Hello, World!\”\”\”    client_connection.sendall(http_response)    time.sleep(60)  # sleep and block the process for 60 seconds def serve_forever():    listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)    listen_socket.bind(SERVER_ADDRESS)    listen_socket.listen(REQUEST_QUEUE_SIZE)    print(\’Serving HTTP on port {port} …\’.format(port=PORT))     while Trueline=\”crayon-5812b4c019daa470749164-22\”>22232425262728293031323334 #####################################################################

    相关内容

    热门资讯

    500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
    定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
    65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
    Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
    scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
    pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
    小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
    python绘图库Matplo... 本文简单介绍了Python绘图库Matplotlib的安装,简介如下: matplotlib是pyt...
    Prometheus+Graf... 一,Prometheus概述 1,什么是Prometheus?Prometheus是最初在Sound...
    微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...