Python3基础-socketserver实现并发
Python提供了两个基本的socket模块。一个是socket,它提供了标准的BSD Socket API;
另一个是socketServer就是对socket的再封装,它提供了服务器中心类,可以简化网络服务器的开发。
socketserver最主要的作用:就是实现一个并发处理
1、socketserver一共有这么几种类型:
1、TCP 协议
class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
2、UDP 协议
class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)
3、Unix 本机之间进程的TCP、UDP (不常用)
class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
class socketserver.UnixDatagramServer(server_address, RequestHandlerClass,bind_and_activate=True)
2、创建一个socketserver 至少分以下几步:
首先,您必须创建一个请求处理类,继承BaseRequestHandlerclass类并且重写父类的handle()方法,该方法将处理传入的请求。
其次,你必须实例化一个上面类型中的一个类(如TCPServer)传递服务器的地址和你上面创建的请求处理类 给这个TCPServer。
然后,调用handle_request()或者serve_forever()方法来处理一个或多个请求。
ser.handle_request() # 只处理一个请求,处理完就退出了
ser.serve_forever() # 处理多个请求,永远执行。
最后,调用server_close()关闭socket。
3、socketserver服务器端和客户端代码
TCP socketserver使用
import socketserver ip_post = ('127.0.0.1',8898) class Myserver(socketserver.BaseRequestHandler): def handle(self): print("conn is:",self.request) #conn conn,addr = sock.accept() print("addr is:",self.request) #addr conn,addr = sock.accept() while True: try: #收消息 data = self.request.recv(1024) print('收到客户端的消息是',data) #发消息 self.request.sendall(data.lower()) except Exception as e: print(e) break if __name__ == '__main__': s=socketserver.ThreadingTCPServer(ip_post,Myserver) #创建了一个线程的TCP服务器类,也就是通过多线程来进行应答客户端 s.serve_forever()
from socket import * import struct from functools import partial ip_port = ('127.0.0.1', 8898) buffer_size =1024 tcp_client = socket(AF_INET, SOCK_STREAM) tcp_client.connect(ip_port) while True: cmd = input('请输入字母>>>').strip() if not cmd: continue if cmd == 'quit': break tcp_client.send(cmd.encode('utf-8')) data =tcp_client.recv(buffer_size) print('收到服务端返回的结果', data.decode('gbk')) tcp_client.close()
UDP socketserver使用
# UDP socketserver使用 import socketserver # 这个请求类要继承BaseRequestHandler,并且还有重写父类里的handle() class MyUdpServer(socketserver.BaseRequestHandler): def handle(self): #接收数据 data,sock = self.request print(data) sock.sendto(data.upper(), self.client_address) if __name__ == '__main__': server = socketserver.ThreadingUDPServer(('127.0.0.1', 8080), MyUdpServer) server.serve_forever()
import socket ip_post =('127.0.0.1',8080) udp_ck = socket.socket(type=socket.SOCK_DGRAM) while True: msg = input('请输入字母>>>').strip() udp_ck.sendto(msg.encode('utf-8'),ip_post) back_msg,addr = udp_ck.recvfrom(1024) print(back_msg.decode('utf-8'),addr)
浙公网安备 33010602011771号