python通过scoket搭建仿真系统
本文采用python语言,通过socket实现简易的仿真。为什么不使用Django、Flask等Web框架?因为内网虚拟机无法依赖第三方库。根据应用场景,该仿真支持的是http+json的请求方式。废话不多说,直接上代码。
1 import re 2 import json 3 import socket 4 5 6 def start_server(): 7 # 创建一个TCP/IP套接字 8 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 9 10 # 设置套接字选项,允许重用本地地址和端口 11 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 12 13 # 定义服务器的地址和端口 14 server_address = ('localhost', 9527) 15 16 # 绑定套接字到地址 17 sock.bind(server_address) 18 19 # 监听连接请求,最多等待1连接 20 sock.listen(1) 21 22 try: 23 # 进入无限循环,等待并处理连接请求 24 while True: 25 # 接受一个新的连接 26 conn, client_address = sock.accept() 27 28 try: 29 # 1、获取接收数据 30 data = conn.recv(2048) 31 # 将接收到的数据转换为字符串 32 data_str = data.decode('utf-8') 33 print("收到数据: %s" % data_str) 34 request_url_ret = get_request_url(data_str) 35 if request_url_ret: 36 # 2、获取请求路径 37 url = request_url_ret.group(1) 38 print("url: %s " % url) 39 # 3、获取请求参数 40 param_dict = get_request_param(data_str) 41 42 # 4、返回响应报文 43 if url.__contains__('queryUser'): 44 if not param_dict.get('userId') or not param_dict.get('userName'): 45 response_data = json.dumps({"code": "500", "msg": "query user fail"}).encode('utf-8') 46 conn.sendall(b'HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: %d\r\n\r\n' % len(response_data)) 47 conn.send(response_data) 48 else: 49 success_reponse_str = {"code": "200", "msg": "query user success"} 50 response_data = json.dumps(success_reponse_str).encode('utf-8') 51 conn.sendall(b'HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: %d\r\n\r\n' % len(response_data)) 52 conn.send(response_data) 53 elif url.__contains__('insertUser'): 54 pass 55 finally: 56 # 无论如何,关闭连接 57 conn.close() 58 59 except KeyboardInterrupt: 60 print('服务器被用户中断') 61 62 # 关闭套接字 63 sock.close() 64 65 def get_request_url(source_data): 66 # 获取请求url 67 request_url_match = re.compile('^POST (.*?) HTTP') 68 request_url_ret = request_url_match.match(source_data) 69 return request_url_ret 70 71 72 def get_request_param(source_data): 73 # 获取请求参数 74 pattern = re.compile(r'\{([^}]+)\}') 75 params_matches = pattern.findall(source_data) 76 print(params_matches[0]) 77 json_str = '{' + params_matches[0] + '}' 78 params_dict = json.loads(json_str) 79 print("params: %s " % params_dict) 80 print(params_dict.get('appId')) 81 return params_dict 82 83 84 if __name__ == '__main__': 85 start_server()
实现的思路很简单大体分为两块:
1、通过正则表达式,解析出客户端发送到服务端的请求路径url,及请求参数param。
2、通过请求路径url分发请求到不同分支处理,响应不同的结果。
验证结果:
请求参数缺失:
请求参数正常:
注意:
不同的python版本支持的语法有差异,需根据自身python版本对部分语法进行调整。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2023-01-02 Spring 事务源码(三):事务相关对象的创建
2023-01-02 Spring AOP源码(四):创建被代理类的代理对象