python中用epolls實現伺服器功能

2021-09-26 22:04:54 字數 2429 閱讀 6039

print("web伺服器---epoll")

import socket

import re

import select

def service_client(new_socket,request):

request_lines = request.splitlines()

print("")

print(">"*20)

print(request_lines)

file_name = ""

ret= re.match(r"[^/]+(/[^ ]*)",request_lines[0])

if ret:

file_name = ret.group(1)

if file_name == "/":

file_name = "/index.html"

#返回http格式的資料,給瀏覽器

#關閉套接字

#new_socket.close()

def main():

"""用來建立套接字"""

# 1、建立套接字

tcp_server_socket = socket.socket(socket.af_inet,socket.sock_stream)

tcp_server_socket.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)

#2、繫結

tcp_server_socket.bind(("",7890))

#3、變為監聽套接字

tcp_server_socket.listen(128)

tcp_server_socket.setblocking(false) # 將套接子變為非堵塞

#建立epoll物件

epl = select.epoll()

#將監聽套接字對應的檔案描述符fd註冊到epoll中

epl.register(tcp_server_socket.fileno(),select.epollin)

fd_event_dict = dict()

while true:

fd_event_list = epl.poll() # 缺省會堵塞,直到os監測到資料到來,通過事件通知方式 告訴這個程式,此時才會

# (fd,event),(套接字對應的檔案描述符,這個檔案描述符到底是什麼事件,例如:可以呼叫revc接收等)

for fd,event in fd_event_list:

# 4、d等待新客戶端的鏈結

if fd == tcp_server_socket.fileno():

new_socket,client_addr = tcp_server_socket.accept()

epl.register(new_socket.fileno(),select.epollin)

fd_event_dict[new_socket.fileno()] = new_socket

elif event == select.epollin:

# 判斷已經鏈結的客戶端是否又資料傳送過來

recv_data = fd_event_dict[fd].recv(1024).decode("utf-8")

if recv_data:

service_client(fd_event_dict[fd],recv_data)

else:

fd_event_dict[fd].close()

epl.unregister(fd)

del fd_event_dict[fd]

#關閉監聽套接字

tcp_server_socket.close()

if __name__ == "__main__":

main()

python中用beautifulSoup 安裝

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!如果你用的是新版的debain或ubuntu,那麼可以通過系統的軟體包管理來安裝 apt get install python bs4 beautiful soup 4 通過pypi發布,所以如果你無法使用系統包管理安裝,那麼也可以通過 easy ...

python中用列表作為佇列

佇列有 先進先出 的,這樣沒刪除或者是鄭加乙個元素,這樣就需要對原列表進行移動,這樣效率會比較低,就引入 collections.deque這樣可以提高效率 from collections import deque queue deque eric john michael print queue...

python中用filter求素數

用filter求素數 生成器,生成乙個無限序列 def odd iter n 1while true n n 2 yieldn 篩選函式 def not divisible n return lambda x x n 0 生成器,不斷返回下乙個素數 defprimes yield 2it odd i...