import socket import threading import requests from urllib.parse import unquote, quote import time # 此类用来解析请求的方法、路径、header,body class Request(): def __init__(self, r): self.content = r self.method = r.split()[0] self.path = r.split()[1] self.body = r.split('\r\n\r\n', 1)[1] def parse_path(self): index = self.path.find('?') if index == -1: return self.path, {} else: path, query_string = self.path.split('?', 1) return path, query_string def headers(self): header_content = self.content.split('\r\n\r\n', 1)[0].split('\r\n')[1:] result = {} for line in header_content: k, v = line.split(': ') result[quote(k)] = quote(v) return result # 平台回复 def login(sock, content, client_ip): r = Request(content) path, _ = r.parse_path() login_response = 'HTTP/1.1 200 OK\r\n' login_response += 'Connection: keep-alive\r\n' login_response += '\r\n' login_response += """ 具体回复消息 """ if path == '具体api': print('收到注册消息') print(r.body) sock.send(login_response.encode()) chunk = sock.recv(1024) while True: if chunk: print('接收消息:%s' % chunk) path = str(chunk.split()[1]) index = path.find('?') if index != -1: path_beat, _ = path.split('?', 1) else: path_beat = path # 心跳 if path_beat.find('HeartBeat') != -1: print('收到心跳消息') heartbeat_response = 'HTTP/1.1 200 OK\r\n' heartbeat_response += 'Connection: keep-alive\r\n' heartbeat_response += '\r\n' heartbeat_response += """ 具体内容 """ sock.send(heartbeat_response.encode()) else: pass chunk = sock.recv(1024) # 处理每一个请求 def tcp_link(sock, client_ip): # sock.settimeout(300) print('\n#####Receive Message:#####') content = '' while True: try: request = sock.recv(2049).decode() if request: # print(request) login(sock, request, client_ip) # break except: pass # sock.close() # 开启服务器 def start_server(server_port, test_ipc_ip): try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind(('', int(server_port))) s.listen(1) while True: sock, addr = s.accept() print(addr) x = str(addr).split("'") if str(x[1]) != str(test_ipc_ip): print('主动断开连接') sock.close() continue t = threading.Thread(target=tcp_link, args=(sock, str(x[1]))) t.start() except Exception as e: print(e) if __name__ == '__main__': # 模拟平台收到主动注册消息 start_server(80, '192.168.0.66')