TCP伺服器非堵塞物件導向長連線

2021-08-19 00:15:04 字數 2818 閱讀 2038

def main():

# server_socket = init_server()

# run_server(server_socket)

tcp_server = webserver()

tcp_server.run_server()

class webserver(object):

def run_server(self):

"""執行服務"""

# 設定server_socket的非堵塞狀態

self.server_socket.setblocking(false)

# 使用客戶端列表接收新的客戶端

clients = list()

# 迴圈接收客戶請求

while true:

# 使用非堵塞時,會報錯,用try進行捕獲異常

try:

# 從三次握手的佇列中取出乙個客戶端關聯的套接字

client, addr = self.server_socket.accept()

# client_run(client)

print(client)

# 將新接收的客戶端放到客戶端列表中

# 設定客戶端的非堵塞狀態

client.setblocking(false)

except exception as e:

pass

# 迴圈取出客戶端,檢視是否有資料

for client_new in clients:

# 捕獲client的非堵塞狀態時產生的異常

try:

# 接收客戶端傳送過來的資料

data = client_new.recv(1024).decode()

# 判斷是否有資料

if data: # 有資料

# 處理乙個客戶端的請求

self.client_run(client_new, data)

else: # 沒有資料

client_new.close() # 關閉沒有資料的客戶端套接字

clients.remove(client_new) # 將沒有資料的客戶端從列表中刪除

except exception as e:

pass

# 關閉套接字

self.server_socket.close()

def client_run(self, client,data):

"""處理乙個客戶端請求"""

# 接收資料

# print(client)

# time.sleep(10)

# data = client.recv(1024).decode()

# 將接收的資料分割為以每一行作為乙個元素的列表

header_lines = data.splitlines()

try:

header_line = header_lines[0]

print(header_line)

res = re.match(r"[^/]+([^ ]*)", header_line)

# 判斷是否匹配

if res: # 匹配了

file = res.group(1)

# 如果是"/",則是在訪問首頁"index.html"

if file == "/":

file = "/index.html"

except exception as e:

print(e)

try:

# 傳送資料

# http頭部字段告訴瀏覽器接收多少位元組結束本次資料的傳輸

body = "頁面不見了"

content = header + "\r\n" + body

client.send(content.encode("utf-8"))

# 關閉套接字

# client.close()-----------注釋掉關閉客戶端,就是長連線

def __init__(self):

"""建立tcp套接字"""

# 建立tcp伺服器端套接字

self.server_socket = socket.socket(socket.af_inet, socket.sock_stream)

# 設定套接字位址選項

self.server_socket.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)

# 繫結本地埠

self.server_socket.bind(("", 9999))

# 變為被動套接字

self.server_socket.listen(128)

# return server_socket

if __name__ == '__main__':

main()

web伺服器物件導向 長連線

from gevent import monkey monkey.patch all 打補丁 import socket import re import gevent import sys class webserver object def init self,port 初始化伺服器套接字 初始...

Web靜態伺服器 非堵塞模式

coding utf 8 from socket import import time 用來儲存所有的新鏈結的socket g socket list list defmain server socket socket af inet,sock stream server socket.setsoc...

Python Web靜態伺服器 非堵塞模式

coding utf 8 from socket import import time 用來儲存所有的新鏈結的socket g socket list list def main server socket socket af inet,sock stream server socket.setso...