非阻塞
newsocket.setblocking(False)
单进程多任务
#单进程非阻塞并发处理多任务
import socket
import time
tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpSocket.bind(("", 9898))
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) #设置端口复用
tcpSocket.listen(128)
tcpSocket.setblocking(False) #设置为非阻塞
clientSocketList = list()
while True:
time.sleep(1)
try:
newSocket, ipPort = tcpSocket.accept()
except Exception as e:
print("暂时没有新客户端...")
else:
print(ipPort,"已经上线...")
newSocket.setblocking(False) #设置套接字为非阻塞
clientSocketList.append(newSocket)
#循环遍历建立连接的套接字中是否有读写请求
for clientSocket in clientSocketList:
try:
receiveData = clientSocket.recv(1024)
except Exception as e:
print("暂时没有数据到来...")
else:
print("没有数据异常")
if receiveData:
print("收到客户端发来的数据",receiveData.decode("GBK"))
else:
print("客户端已关闭")
clientSocketList.remove(clientSocket)
clientSocket.close()
单进程多任务Web服务器
听音乐
import socket
def serviceClient(newSocket, receiveText):
loc = receiveText.find("\r\n")
requestLine = receiveText[:loc].split(" ")
filePath = requestLine[1]
print("正在请求:%s" % filePath)
if filePath == "/":
filePath = "/index.html"
try:
f = open("staticPage"+filePath,"rb")
except: #不存在的页面404
responseHeader = "HTTP/1.1 404 Not Found\r\n"