Socket 多任务
Posted juno3550
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket 多任务相关的知识,希望对你有一定的参考价值。
1. 循环版实现多连接
2. threading.Thread 多线程(传输文件)
3. SockerServer 实现多任务
3.1 ForkingMixIn - 多进程(限 linux)
4. Select 模块(单线程实现多线程效果)
1. 循环版实现多连接
以下例子算狭义上实现多用户访问服务,但都是同步执行,也就是一个用户连接关闭,下个用户才可以开始执行向服务发送请求数据。
其实现的核心是服务器接收连接部分写在死循环内,可以一直保持接收新用户端发起的请求的状态。
服务器端
1 import socket 2 3 HOST = ‘127.0.0.1‘ 4 PORT = 50008 5 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 6 s.bind((HOST, PORT)) 7 s.listen(5) 8 9 while True: 10 print ("开始进入监听状态...") 11 conn, addr = s.accept() 12 print ("接收到连接:", addr) 13 while True: 14 try: 15 data = conn.recv(1024) 16 if not data: 17 print("断开客户端连接") 18 break 19 print ("收到客户端数据:", data.decode("utf-8")) 20 msg = "这是一个循环版多连接服务测试" 21 conn.sendall(msg.encode("utf-8")) 22 except socket.error: 23 break 24 conn.close()
客户端
1 import socket 2 3 HOST = ‘127.0.0.1‘ 4 PORT = 50008 5 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 6 7 s.connect((HOST, PORT)) 8 times = 3 9 while times>0: 10 cmd = input("向服务器发送数据:") 11 s.sendall(cmd.encode("utf-8")) 12 data = s.recv(1024) 13 print ("接收到服务器端的数据:", data.decode("utf-8")) 14 times -= 1 15 s.close() # 关闭连接
2. threading.Thread 多线程(传输文件)
服务端定义一个传输内容得规则;客户端按照此内容进行传输;服务端按照此内容进行解析。
服务器端
1 import socket, time, socketserver, struct, os, threading 2 3 # 固定的server启动流程 4 host = ‘127.0.0.1‘ 5 port = 12307 6 # 定义socket类型 7 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 8 # 绑定需要监听的ip和端口号 9 s.bind((host, port)) 10 s.listen(1) 11 12 13 # 定义一个线程的任务函数 14 def conn_thread(connection, address): 15 while True: 16 try: 17 connection.settimeout(600) 18 # struct.calcsize--->计算12个字符和1个长整型的数据有多长 19 #12个字符对应的是客户端发来的文件名,1个长整型对应的是文件内容的长度大小 20 fileinfo_size = struct.calcsize(‘36sl‘) # 12s表示12个字符,l表示一个长整型数 21 buf = connection.recv(fileinfo_size) # 正好接收12个字符长度和一个整数的数据 22 # 如果不加这个if,第一个文件传输完成后会自动走到下一句并阻塞,需要拿到文件大小信息才可以继续执行 23 if buf: 24 filename, filesize = struct.unpack(‘36sl‘, buf) 25 filename_f = filename.decode("utf-8").strip(‘