使用 socket_server 创建一个简单的服务器和客户端
创建TCP服务器
# StreamRequestHandler: 支持操作文件对象那样话操作输入输出套接字 # 使用 readline() 获取客户消息 # 使用 write() 把字符串发给客户端 from socketserver import TCPServer as TCP, StreamRequestHandler as SRH from time import ctime HOST = '' PORT = 21569 ADDR = (HOST, PORT) class MyRequestHandle(SRH): # 再有客户端消息进来的时候, handle 方法就会被调用 def handle(self): '''重写handle方法''' print(f'...连接地址: {self.client_address}') self.wfile.write(f'[{ctime()}] {self.rfile.readline()}'.encode()) tcp_serv = TCP(ADDR, MyRequestHandle) print('等待连接...') tcp_serv.serve_forever()
创建TCP客户端
# 创建一个TCP客户端, 程序会提示用户输入要传给服务器的信息, 显示服务器返回的加了时间戳的结果 from socket import * # HOST 和 PORT 表示服务器的主机名与端口号, 由于这里是在一台电脑运行, 所以 HOST 里放的是 localhost # 如果服务器和客户端不在一台电脑上, HOST要做出相应的修改 # 端口号和服务器的设置完全相同 HOST = 'localhost' # HOST 变量为空, 表示 bind() 函数可以绑定到所有的有效地址上 PORT = 21569 # 设置端口号 BUFSIZ = 1024 # 设置缓冲区大小为1K ADDR = (HOST, PORT) while True: # socket_server 的请求处理器默认行为是接受连接, 得到请求, 然后关闭连接 # 所以这里每次都要创建新的套接字连接, 有点像UDP。不过这种行为也可以通过重写请求处理器中相应的函数来改变 tcp_cli_sock = socket(AF_INET, SOCK_STREAM) tcp_cli_sock.connect(ADDR) data = input('>>>>>>请输入内容: ') if not data: break tcp_cli_sock.send(f'{data} '.encode()) data = tcp_cli_sock.recv(BUFSIZ) if not data: break print(f'>>>>>客户端data: {data}') tcp_cli_sock.close()
TCP客户端执行结果
TCP服务端执行结果