Python网络编程(七)-标准库socketserver开发服务端,客户端网络应用
1. socketserver简介:
python3提供了标准库socketserver,用于创建服务端,客户端网络程序。它对socket进行了封装,用起来更加方便,简单。
2.举例:一个简单的C/S架构程序:
程序清单:
socketserver端:my_socketserver_s.py
#!/usr/bin/env pythonimport socketserverfrom time import ctimeHOST = 'localhost'PORT = 2222ADDRESS = (HOST, PORT)class RequestTCPHandler(socketserver.BaseRequestHandler): def handle(self): print('...connected from:', self.client_address) try: while True: self.data = self.request.recv(1024) print("send:".format(self.client_address), self.data, ctime()) if not self.data: print("connection fail") break self.request.sendall(self.data) except Exception as e: print(self.client_address, "disconnection") finally: self.request.close() def setup(self): print("create connection:", self.client_address) def finish(self): print("finish!")if __name__ == "__main__": print('socket server main begin...') server = socketserver.TCPServer(ADDRESS, RequestTCPHandler) server.serve_forever()
RequestTCPHandler用于接受客户端发送过来的请求,并且进行处理。用request.sendall进行数据的发送。
创建一个TCPServer,其中,第一个参数是ip地址,第二个参数时RequestTCPHandler的实例。
客户端程序:my_socketserver_c.py
#!/usr/bin/env pythonimport socketHOST = 'localhost'PORT = 2222ADDRESS = (HOST, PORT)def connect(address): print('socket client main begin...') myClient = socket.socket() myClient.connect(address) while True: cmd = input("(q退出)%").strip() if len(cmd) == 0: continue if cmd == "q": break myClient.send(cmd.encode()) res = myClient.recv(1024) print(res.decode()) myClient.close()if __name__ == "__main__": print('socket client main begin...') connect(ADDRESS)
标准的socket客户端程序:
创建socket->建立连接->send->recv,
当输入q时,结束程序。
运行结果如下:
socketserver端运行结果:
socket server main begin...
create connection: ('127.0.0.1', 52653)
...connected from: ('127.0.0.1', 52653)
send: b'abc' Thu Sep 23 11:10:00 2021
send: b'12345' Thu Sep 23 11:10:02 2021
send: b'' Thu Sep 23 11:10:04 2021
connection fail
finish!
client端运行结果:
python mysocket_server_c.py
socket client main begin...
socket client main begin...
(q退出)%abc
abc
(q退出)%12345
12345
(q退出)%qProcess finished with exit code 0
server,client