socketserver模块 内置模块 (其实现原理为并发)
socketserver这个模块主要是为了解决:
TCP协议中,服务器不能同时连接多个客户端的问题
是处于socket抽象层和应用层之间的一层, 比socket 更贴近用户.
其使用方法是固定的:
客户端代码:
1 import socket 2 sk = socket.socket() 3 sk.connect(('127.0.0.1',8080)) 4 5 msg_s = input('>>>') 6 sk.send(msg_s.encode('utf-8')) 7 8 print(sk.recv(1024).decode('utf-8')) 9 10 sk.close()
服务端代码:
1 import socketserver 2 3 4 class MySocket(socketserver.BaseRequestHandler): 5 def handle(self):# 这个方法的名字是固定的,必须是这个名字 6 # 收发的逻辑代码 7 # self.request == conn 8 msg = self.request.recv(1024).decode('utf-8') 9 print(msg) 10 self.request.send(msg.upper().encode('utf-8')) 14 server = socketserver.TCPServer(('127.0.0.1',8080),MySocket)# 固定的 15 server.serve_forever()# 开启一个永久性的服务
代码中能更改的部分:
socket模块的更多用法:
import socket import time # from socket import SOL_SOCKET,SO_REUSEADDR sk = socket.socket() # sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) sk.setblocking(False)# 设置accept和recv两个方法的阻塞与非阻塞状态 # 参数为False 代表设置为非阻塞状态 # 参数为True 或者不写,默认为阻塞状态 sk.bind(('127.0.0.1',8080)) # sk.settimeout(4)# 设置等待超时时间 # print(sk.gettimeout())# 获取等待超时时间 sk.listen() # print(123) time.sleep(1) conn,addr = sk.accept()# 阻塞 # print(456) print(conn.recv(1024))# 阻塞 # print(789) # print(conn.recv(1024)) # print(conn.getpeername())# 获取连接的远端的地址 # print(conn.getsockopt()) conn.close() sk.close()
补充:
进度条代码:
import time for i in range(51): time.sleep(0.12) # 睡眠时间 print(' '+ i*'=' + '>' + str(i*2) + '%',end='')