import socket
import re
import select
def service_client(client_socket,request):
"""為客戶端服務"""
# 1.提取檔名
request_lines = request.splitlines()
request_first_line = request_lines[0]
file_name = re.match(r"[^/] + (/[^ ]*)",request_first_line).group(1)
if file_name == "/":
file_name = "/index.html"
# 3.根據檔名去讀取內容。
try:
with open("./html" + file_name, "rb") as f:
content = f.read()
except exception as ret:
# 意味著沒有這個對應的資源,返回http的應答資料
# 意味著有資源,返回http的應答資料
# 1.建立套接字
tcp_s_socket = socket.socket(socket.af_inet,socket.sock_stream)
# 2.設定套接字
tcp_s_socket.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)
# 3.繫結本地資訊
tcp_s_socket.bind(("",8080))
# 4.設定為監聽套接字
tcp_s_socket.listen(128)
# 5.建立乙個epoll物件
ep = select.epoll()
ep.register(tcp_s_socket.fileno(),select.epollin|select.epollin)
fd_socket_dict = dict()
while true:
# 缺省會有堵塞,直到作業系統收到相應的資料到來
# 建立乙個列表,裡面包含有以元組形式存放的成對的套接字檔案識別符號和事件名稱
fd_event_list = ep.poll()
for fd, event in fd_event_list:
if fd == tcp_s_socket.fileno():
clinet_socket, client_addr = tcp_s_socket.accept()
ep.register(client_socket.fileno(),select.epollin|select.epollint)
fd_socket_dict[client_socket.fileno()] = client_socket
elif event == select.epollin:
recv_data = fd_socket_dict[fd].recv(1024)
if recv_data:
service_client(fd_socket_dict[fd],recv_data.decode("utf-8"))
else:
ep.unregister(fd)
fd_socket_dict[fd].close()
del fd_socket_dict[fd]
# 關閉套接字
tcp_s_socket.close()
if __name__=="__main__":
main()
epoll回聲伺服器
epoll是在linux系統中,一種高效率的i o復用技術.在linux的網路程式設計中,很長的時間都在使用select來做事件觸發。在linux新的核心中,有了一種替換它的機制,就是epoll。相比於select,epoll最大的好處在於它不會隨著監聽fd數目的增長而降低效率。因為在核心中的sel...
基於epoll的web伺服器
我們在大量併發的時候epoll有高的效能,所以我們選擇用他去做乙個bs模型的web伺服器 web伺服器 網路上是epoll併發,在解析http命令是下面的思路 具體的主要看 的思路 去除前面的 int n1 0 char pname name if strlen pname 1 else 通過對字元...
Web伺服器 併發伺服器 Epoll(3 4 5)
epoll是一種解決方案,nginx就是用的這個 中心思想 不要再使用多程序,多執行緒了,使用單程序,單執行緒去實現併發 在上面部落格實現的 中使用過的輪詢去檢視套接字有沒有資料,而epoll是主動通知 當使用多程序的時候,是複製乙份資源去檢視,epoll不用複製,直接來 優勢 1.共享記憶體 2....