python 服务端多线程编程_python 多线程实现简易 web服务器

[Python] 纯文本查看 复制代码import socket

import re

import threading

'''

多线程实现web服务器:

# 1、新建线程;

# 2、在新线程中关闭套接字

# 注:线程资源复制,套接字关闭一个就行

'''

def response(new_socket):

data = new_socket.recv(1024).decode("utf-8").splitlines()

print("请求: ")

for item in data:

print(item)

ret = re.search(r'[^/]+(/[^ ]*)', data[0])

print(ret)

if ret:

file_name = ret.group(1)

# print("*"*50, file_name)

if file_name == "/":

file_name = "/index.html"

# 2. 返回http格式的数据,给浏览器

try:

# 网页文件的路径自己设置

f = open("F:/code/python/tmp/web/HTML家政服务公司网站模板" + file_name, "rb")

except:

response = "HTTP/1.1 404 NOT FOUND\r\n"

response += "\r\n"

response += "------file not found-----"

new_socket.send(response.encode("utf-8"))

else:

html_content = f.read()

f.close()

# 2.1 准备发送给浏览器的数据---header

response = "HTTP/1.1 200 OK\r\n"

response += "\r\n"

# 2.2 准备发送给浏览器的数据---boy

# response += "hahahhah"

# 将response header发送给浏览器

new_socket.send(response.encode("utf-8"))

# 将response body发送给浏览器

new_socket.send(html_content)

# 新进程中关闭套接字

new_socket.close()

def main():

# 初始化套接字

tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

tcp_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

# 1、绑定端口

tcp_server.bind( ('',1027))

# 2、设置监听

tcp_server.listen(128)

while True:

# 3、等待接收

new_server, client_adder = tcp_server.accept()

#4、响应

threading.Thread( target= response,args=(new_server,)).start()

#5、关闭新套接字------此处关闭会导致新套接字无法正常使用

#new_server.close()

# 6、关闭服务器套接字

tcp_server.close()

if __name__ == "__main__":

main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Python多客户端上传文件到服务端,并且服务端要支持多线程,可以使用`threading`模块来创建多线程。具体步骤如下: 1. 服务端创建socket并监听端口,等待客户端连接。 2. 客户端连接服务端,并发送要上传的文件名和大小等信息。 3. 服务端接收客户端发送的信息,并创建一个同名文件,准备接收文件内容。 4. 创建一个新线程,用于接收文件内容并写入文件。 5. 客户端发送文件传输结束的标志。 6. 服务端接收标志并关闭连接。 以下是Python示例代码: 服务端代码: ```python import socket import threading import os SERVER_HOST = '0.0.0.0' SERVER_PORT = 5000 BUFFER_SIZE = 4096 def handle_client(client_socket, client_addr): # 接收文件名和大小等信息 file_info = client_socket.recv(BUFFER_SIZE).decode() file_name, file_size = file_info.split(':') file_size = int(file_size) print(f'Receiving file "{file_name}" ({file_size} bytes) from client {client_addr}') # 创建同名文件并准备接收文件内容 with open(file_name, 'wb') as f: # 创建新线程,用于接收文件内容并写入文件 def receive_file(): received_size = 0 while received_size < file_size: data = client_socket.recv(BUFFER_SIZE) f.write(data) received_size += len(data) print(f'File "{file_name}" received from client {client_addr}') thread = threading.Thread(target=receive_file) thread.start() # 等待新线程结束 thread.join() # 关闭连接 client_socket.close() def main(): # 创建socket并监听端口 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((SERVER_HOST, SERVER_PORT)) server_socket.listen(1) print(f'Server listening on port {SERVER_PORT}') while True: # 等待客户端连接 client_socket, client_addr = server_socket.accept() print(f'Client {client_addr} connected') # 创建新线程,用于处理客户端连接 thread = threading.Thread(target=handle_client, args=(client_socket, client_addr)) thread.start() if __name__ == '__main__': main() ``` 客户端代码同上。 在上面的示例代码中,服务端使用了多线程,每个客户端连接都会创建一个新线程。在新线程中接收文件内容并写入文件,主线程则负责处理客户端连接并创建新线程。使用多线程可以提高服务端的并发性能。另外,在多线程编程中,需要注意线程安全问题,如共享变量的修改等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值