/
dixsu
/
websocket-client
Обзор
Документация
Войти
/
dixsu
/
websocket-client
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
master
websocketClient.py
461 строка
20 KB
Роман Сахно
Initial commit
17 янв 2025, 14:50
17 янв 2025, 14:50
ee78a9b
Код
Авторство
О чём код?
# import asyncio # import websockets # import requests # # # Конфигурация # VPS_IP = "192.168.0.16" # VPS_PORT = 8080 # DEVICE_ID = "device-123" # LOCAL_PORT = 80 # # # URL WebSocket-сервера # server_url = f"ws://{VPS_IP}:{VPS_PORT}/ws?deviceId={DEVICE_ID}" # # async def websocket_client(): # async with websockets.connect(server_url) as websocket: # print(f"Connected to server at {websocket.remote_address}") # # while True: # try: # # Получение HTTP-запроса от WebSocket-сервера # message = await websocket.recv() # print(f"Received message from server: {message}") # # # Разбор HTTP-запроса # request_lines = message.split("\n") # method, path, _ = request_lines[0].split(" ", 2) # headers = {} # body = None # header_finished = False # # # Разбираем заголовки и тело запроса # for line in request_lines[1:]: # if line.strip() == "": # header_finished = True # continue # if not header_finished: # key, value = line.split(":", 1) # headers[key.strip()] = value.strip() # else: # if body is None: # body = line # else: # body += "\n" + line # # # Формируем URL для локального сервера (порт 80 устройства) # url = f"http://localhost:{LOCAL_PORT}{path}" # print(f"Proxying request to: {url}") # # # Заголовки для запроса к локальному серверу # headers = { # "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:133.0) Gecko/20100101 Firefox/133.0", # "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", # "Accept-Language": "en-US,en;q=0.5", # "Connection": "keep-alive", # "Host": "localhost" # } # # # Выполняем запрос к локальному серверу # if method == "GET": # response = requests.get(url, headers=headers) # elif method == "POST": # response = requests.post(url, headers=headers, data=body) # elif method == "PUT": # response = requests.put(url, headers=headers, data=body) # elif method == "DELETE": # response = requests.delete(url, headers=headers) # else: # # Если метод не поддерживается # response = requests.Response() # response.status_code = 405 # response.reason = "Method Not Allowed" # # # Формируем HTTP-ответ для отправки обратно на сервер VPS # response_message = f"HTTP/1.1 {response.status_code} {response.reason}\n" # for key, value in response.headers.items(): # response_message += f"{key}: {value}\n" # # # Отправляем сообщение частями # chunk_size = 1024 # Размер одного чанка (например, 1 КБ) # for i in range(0, len(response.text), chunk_size): # chunk = response.text[i:i + chunk_size] # await websocket.send(chunk) # # print(f"Response successfully sent to the server") # # except websockets.exceptions.ConnectionClosed as e: # print(f"Connection to server closed: {e}") # break # except Exception as e: # print(f"Unexpected error: {e}") # break # # # Основной блок запуска # if __name__ == "__main__": # asyncio.run(websocket_client()) # import asyncio # import websockets # import requests # # # Конфигурация # VPS_IP = "192.168.0.16" # VPS_PORT = 8080 # DEVICE_ID = "device-123" # LOCAL_PORT = 80 # # # URL WebSocket-сервера # server_url = f"ws://{VPS_IP}:{VPS_PORT}/ws?deviceId={DEVICE_ID}" # # async def websocket_client(): # async with websockets.connect(server_url) as websocket: # print(f"Connected to server at {websocket.remote_address}") # # while True: # try: # # Получение HTTP-запроса от WebSocket-сервера # message = await websocket.recv() # print(f"Received message from server: {message}") # # # Разбор HTTP-запроса # request_lines = message.split("\n") # method, path, _ = request_lines[0].split(" ", 2) # headers = {} # body = None # header_finished = False # # # Разбираем заголовки и тело запроса # for line in request_lines[1:]: # if line.strip() == "": # header_finished = True # continue # if not header_finished: # key, value = line.split(":", 1) # headers[key.strip()] = value.strip() # else: # if body is None: # body = line # else: # body += "\n" + line # # # Формируем URL для локального сервера (порт 80 устройства) # url = f"http://localhost:{LOCAL_PORT}{path}" # print(f"Proxying request to: {url}") # # # Заголовки для запроса к локальному серверу # headers = { # "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:133.0) Gecko/20100101 Firefox/133.0", # "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", # "Accept-Language": "en-US,en;q=0.5", # "Connection": "keep-alive", # "Host": "localhost" # } # # # Выполняем запрос к локальному серверу # if method == "GET": # response = requests.get(url, headers=headers) # elif method == "POST": # response = requests.post(url, headers=headers, data=body) # elif method == "PUT": # response = requests.put(url, headers=headers, data=body) # elif method == "DELETE": # response = requests.delete(url, headers=headers) # else: # # Если метод не поддерживается # response = requests.Response() # response.status_code = 405 # response.reason = "Method Not Allowed" # # # Формируем HTTP-ответ для отправки обратно на сервер VPS # response_message = f"HTTP/1.1 {response.status_code} {response.reason}\n" # for key, value in response.headers.items(): # response_message += f"{key}: {value}\n" # # # Добавляем тело ответа после заголовков # response_message += "\n" + response.text # # print(f"Sending full response back to server") # print(f"Response status code: {response.status_code}") # # try: # await websocket.send(response_message) # print("Response successfully sent to the server") # except Exception as e: # print(f"Error while sending response: {e}") # # except websockets.exceptions.ConnectionClosed as e: # print(f"Connection to server closed: {e}") # break # except Exception as e: # print(f"Unexpected error: {e}") # break # # async def send_large_message(websocket, message, chunk_size=1024): # for i in range(0, len(message), chunk_size): # chunk = message[i:i + chunk_size] # await websocket.send(chunk) # # Отправьте пустой фрагмент, чтобы сообщить серверу о завершении сообщения # # # Основной блок запуска # if __name__ == "__main__": # asyncio.run(websocket_client()) # import asyncio import websockets import requests # Конфигурация #VPS_IP = "192.168.0.16" # IP-адрес VPS VPS_IP = "172.16.42.2" # IP-адрес VPS VPS_PORT = 8080 # Порт WebSocket-сервера DEVICE_ID = "device-123" # Уникальный идентификатор устройства LOCAL_PORT = 80 # Локальный веб-сервер устройства # URL WebSocket-сервера server_url = f"ws://{VPS_IP}:{VPS_PORT}/ws?deviceId={DEVICE_ID}" # Функция для проксирования запросов async def websocket_client(): async with websockets.connect(server_url) as websocket: print(f"Connected to server at {websocket.remote_address}") while True: try: # Получение HTTP-запроса от WebSocket-сервера message = await websocket.recv() print(f"Received message from server: {message}") # Разбор HTTP-запроса request_lines = message.split("\n") method, path, _ = request_lines[0].split(" ", 2) headers = {} body = None header_finished = False # Разбираем заголовки и тело запроса for line in request_lines[1:]: if line.strip() == "": header_finished = True continue if not header_finished: key, value = line.split(":", 1) headers[key.strip()] = value.strip() else: if body is None: body = line else: body += "\n" + line # Формируем URL для локального сервера (порт 80 устройства) url = f"http://localhost:{LOCAL_PORT}{path}" print(f"Proxying request to: {url}") # Заголовки для запроса к локальному серверу headers = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:133.0) Gecko/20100101 Firefox/133.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Connection": "keep-alive", "Host": "localhost" } # Выполняем запрос к локальному серверу if method == "GET": response = requests.get(url, headers=headers) elif method == "POST": response = requests.post(url, headers=headers, data=body) elif method == "PUT": response = requests.put(url, headers=headers, data=body) elif method == "DELETE": response = requests.delete(url, headers=headers) else: # Если метод не поддерживается response = requests.Response() response.status_code = 405 response.reason = "Method Not Allowed" response._content = b"Method Not Allowed" # Формируем HTTP-ответ для отправки обратно на сервер VPS response_message = f"HTTP/1.1 {response.status_code} {response.reason}\n" for key, value in response.headers.items(): response_message += f"{key}: {value}\n" response_message += "\n" + response.text response_message += "\r\n" print(f"Sending response back to server: {response.status_code}") print(f"Sending response_message back to server: {response_message}") try: #await websocket.send(response_message) await send_large_message(websocket, response_message) print("Response successfully sent to the server") except Exception as e: print(f"Error while sending response: {e}") except websockets.exceptions.ConnectionClosed as e: print(f"Connection to server closed: {e}") break except Exception as e: print(f"Unexpected error: {e}") break async def send_large_message(websocket, message, chunk_size=1024): for i in range(0, len(message), chunk_size): chunk = message[i:i + chunk_size] await websocket.send(chunk) # Отправьте пустой фрагмент, чтобы сообщить серверу о завершении сообщения # Основной блок запуска if __name__ == "__main__": asyncio.run(websocket_client()) # async def websocket_client(): # async with websockets.connect(server_url) as websocket: # print(f"Connected to server at {server_url}") # # Проверка, что соединение открыто # if websocket.open: # print("Connection is open.") # # while True: # try: # # Получение HTTP-запроса от WebSocket-сервера # message = await websocket.recv() # print(f"Received message from server: {message}") # # # Разбор HTTP-запроса # request_lines = message.split("\n") # method, path, _ = request_lines[0].split(" ", 2) # headers = {} # body = None # header_finished = False # # # Разбираем заголовки и тело запроса # for line in request_lines[1:]: # if line.strip() == "": # header_finished = True # continue # if not header_finished: # key, value = line.split(":", 1) # headers[key.strip()] = value.strip() # else: # if body is None: # body = line # else: # body += "\n" + line # # # Формируем URL для локального сервера (порт 80 устройства) # url = f"http://localhost:{LOCAL_PORT}{path}" # print(f"Proxying request to: {url}") # headers={ # "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:133.0) Gecko/20100101 Firefox/133.0", # "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", # "Accept-Language": "en-US,en;q=0.5", # "Connection": "keep-alive", # "Host": "localhost",} # # Выполняем запрос к локальному серверу # if method == "GET": # response = requests.get(url, headers=headers) # elif method == "POST": # response = requests.post(url, headers=headers, data=body) # elif method == "PUT": # response = requests.put(url, headers=headers, data=body) # elif method == "DELETE": # response = requests.delete(url, headers=headers) # else: # # Если метод не поддерживается # response = requests.Response() # response.status_code = 405 # response.reason = "Method Not Allowed" # response._content = b"Method Not Allowed" # # # Формируем HTTP-ответ для отправки обратно на сервер VPS # response_message = f"HTTP/1.1 {response.status_code} {response.reason}\n" # for key, value in response.headers.items(): # response_message += f"{key}: {value}\n" # # response_message += "\r\n" # # Отправляем ответ через WebSocket # print(f"Sending response back to server: {response.status_code}") # print(f"Sending response back to server: {response}") # # print(f"Message length: {len(response_message)}") # try: # await websocket.send(response_message) # print("Response successfully sent to the server") # # Проверка, что соединение открыто # if websocket.open: # print("Connection is open.") # except Exception as e: # print(f"Error while sending response: {e}") # # # response_message += "\n" + response.text # # # #print(f"Sending response back to server: {response_message}") # # chunk_size = 1024 # Размер одного чанка (например, 1 КБ) # # for i in range(0, len(response_message), chunk_size): # # chunk = response_message[i:i + chunk_size] # # print(f"{chunk}") # # await websocket.send(chunk) # # await websocket.send(response_message) # # #await send_large_message(websocket, response_message) # # # except websockets.ConnectionClosed as e: # print(f"Connection to server closed {e}") # break # except websockets.ConnectionClosedError as e: # print(f"ConnectionClosedError: {e}") # except websockets.InvalidState as e: # print(f"InvalidStateError: {e}") # except Exception as e: # print(f"Unexpected error: {e}") # # # except Exception as e: # print(f"Error: {e}") # break # # # async def send_large_message(websocket, message, chunk_size=1024): # for i in range(0, len(message), chunk_size): # chunk = message[i:i + chunk_size] # await websocket.send(chunk) # # Отправьте пустой фрагмент, чтобы сообщить серверу о завершении сообщения # await websocket.send("") # # # Основной блок запуска # if __name__ == "__main__": # asyncio.run(websocket_client())