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版本对部分语法进行调整。

posted @   无虑的小猪  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
历史上的今天:
2023-01-02 Spring 事务源码(三):事务相关对象的创建
2023-01-02 Spring AOP源码(四):创建被代理类的代理对象
点击右上角即可分享
微信分享提示