客户端
学习资料:Python 网络编程 | 菜鸟教程
使用socket模块。
from socket import *
import os
ip_port=("192.168.90.87",8081) #服务端IP和端口
buffer_size = 1024 #接收消息缓冲大小
tcp_client = socket(AF_INET,SOCK_STREAM) #创建socket
tcp_client.connect(ip_port) # 建立服务端连接
while True:
msg = input(">>>:").strip()
if not msg:continue
if msg =="quit":break
#发送消息
tcp_client.sendall(msg.encode("utf-8")) #使用encode方法转成bytes utf-8编码
data = tcp_client.recv(buffer_size)
print("服务器命令执行的结果是:", data.decode("utf-8")) # 将bytes转成str
tcp_client.close()
服务器端
socket不支持多并发,使用socketserver。socketserver框架是一个基本的socket服务器端框架, 使用了threading来处理多个客户端的连接, 使用seletor模块来处理高并发访问。
- socketserver创建
首先创建一个请求处理类,继承BaseRequestHandlerclass类并且重写父类的handle()方法。
其次实例化一个上面类型中的一个类(如TCPServer或UDPServer)传递服务器的地址和你上面创建的请求处理类 给这个TCPServer或rUDPServe。
调用serve_forever()方法来处理多个请求。最后,调用server_close()关闭socket。
import socketserver from Config import gConfig import time class SocketServer(socketserver.BaseRequestHandler): def handle(self): print("conn is :",self.request) print("addr is :",self.client_address) # addr while True: try: data = self.request.recv(1024) if not data:break msg = data.decode("utf-8") print("收到客户端的消息是",msg) #回消息 curtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) self.request.sendall(str(curtime+ "|OK_200").encode("utf-8")) except Exception as e: print(e) curtime = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) self.request.sendall(str(curtime+ "|ERROR_400").encode("utf-8")) break class SocketServerManager: __threadingTCPServer = None def start(self): ip_port = (gConfig.getNetIp(), gConfig.port) # print(ip_port) # self.ThreadingTCPServer() self.__threadingTCPServer = socketserver.ThreadingTCPServer(ip_port,SocketServer) self.__threadingTCPServer.daemon_threads = True # 设置为守护线程 后台线程。 # self.__threadingTCPServer.handle_request() # handle_request() 只处理一个请求,处理完就退出了 self.__threadingTCPServer.serve_forever() # 处理多个请求,永远执行 #print("****") def close(self): self.__threadingTCPServer.shutdown() self.__threadingTCPServer.server_close() if __name__ == "__main__": socketManager = SocketServerManager() socketManager.start()
总结点
- 时间格式化2022-00-00 00:00:00
time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
-
daemon_threads 设置线程为守护线程。作用是在后台执行,并随着程序的退出而退出
-
serve_forever调用是阻塞式的。
-
__threadingTCPServer要正常关闭时,需要调用shutdown。目的是Stops the serve_forever loop。