0 / 0 / 0
Регистрация: 11.11.2019
Сообщений: 28

Python 3 Обработка сокетов больших размеров

05.07.2023, 13:07. Показов 870. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем салют!

Взял прокси сервер отсюда. Он работает, но есть проблема: когда к нему приходит длинный json, он принимает его частями и, соответственно, отправляет дальше по частям, что приводит к неверному чтению json на другом конце.

Нашёл решение, и получилось так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def main_loop(self):
 
    self.input_list.append(self.server)
 
    while 1:
        time.sleep(delay)
        ss = select.select
        inputready, outputready, exceptready = ss(self.input_list, [], [])
        for self.s in inputready:
 
            if self.s == self.server:
                self.on_accept()
                break
            print(1)
            self.data = self.recvall()
            print(2)
            #self.data = self.s.recv(buffer_size)
            if self.data != None:
                if len(self.data) == 0:
                    self.on_close()
                else:
                    self.on_recv()
            else:
                self.on_close()
 
  def recvall(self):
    BUFF_SIZE = 4096
    data = bytearray()
    while True:
        packet = self.s.recv(BUFF_SIZE)
        if not packet:
            break
        data.extend(packet)
    return data
Но почему-то поток соединений зависает на первом соединении и дальше ничего не происходит.
Python3.6
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.07.2023, 13:07
Ответы с готовыми решениями:

Обработка текстовых файлов (логов) больших размеров
Добрый день. Хочу написать "обработчик" текстовых логов. Логи очень большие (к примеру бывают 20000 строк и больше). Логи состоят...

Обработка сокетов с epoll
Не актуально

базы больших размеров
как правильно строить базы данных в которых будет очень много записей и как потом добавлять в них столбцы? Я создал очередную таблицу -...

4
 Аватар для Semen-Semenich
5191 / 3442 / 1167
Регистрация: 21.03.2016
Сообщений: 8,273
05.07.2023, 13:36
Цитата Сообщение от DanilR Посмотреть сообщение
Нашёл решение, и получилось так
так там всразу предупреждение
Если возможно, используйте существующий протокол прикладного уровня или определите свой собственный, например. предварять каждое сообщение целым числом фиксированной длины, указывающим длину данных, которые следуют, или завершать каждое сообщение символом '\n'.
скорее всего нет передачи символа и сокет продолжает ждать текущий пакет данных

Добавлено через 16 минут
почитай
1
0 / 0 / 0
Регистрация: 11.11.2019
Сообщений: 28
05.07.2023, 18:37  [ТС]
Semen-Semenich, прочитал по ссылке. начал использовать.
в моменте, когда вызывается recv_msg и он пытается посчитать длину сообщения struct.unpack всегда возвращает не верный размер, всегда около 1212498244 байт. И после этого, соответственно, начинает ждать сообщение такой длинны и все. Хотя на вход приходит вот такой curl curl -v localhost/
Миниатюры
Python 3 Обработка сокетов больших размеров  
Изображения
 
0
 Аватар для Semen-Semenich
5191 / 3442 / 1167
Регистрация: 21.03.2016
Сообщений: 8,273
05.07.2023, 22:12
DanilR, а ваш клиент отправляет размер файла?
клиент
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# client.py
import os
import socket
import struct
 
def send_file(sck: socket.socket, filename):
    # Получение размера файла.
    filesize = os.path.getsize(filename)
    # В первую очередь сообщим серверу, 
    # сколько байт будет отправлено.
    sck.sendall(struct.pack("<Q", filesize))
    # Отправка файла блоками по 1024 байта.
    with open(filename, "rb") as f:
        while read_bytes := f.read(1024):
            sck.sendall(read_bytes)
with socket.create_connection(("localhost", 6190)) as conn:
    file = input(' Ваш файл: >  ')
    print("Подключение к серверу.")
    print("Передача файла...")
    send_file(conn, file)
    print("Отправлено.")
print("Соединение закрыто.")


сервер

Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# server.py
import socket
import struct
def receive_file_size(sck: socket.socket):
    # Эта функция обеспечивает получение байтов, 
    # указывающих на размер отправляемого файла, 
    # который кодируется клиентом с помощью 
    # struct.pack(), функции, которая генерирует 
    # последовательность байтов, представляющих размер файла.
    fmt = "<Q"
    expected_bytes = struct.calcsize(fmt)
    received_bytes = 0
    stream = bytes()
    while received_bytes < expected_bytes:
        chunk = sck.recv(expected_bytes - received_bytes)
        stream += chunk
        received_bytes += len(chunk)
    filesize = struct.unpack(fmt, stream)[0]
    return filesize
def receive_file(sck: socket.socket, filename):
    # Сначала считываем из сокета количество 
    # байтов, которые будут получены из файла.
    filesize = receive_file_size(sck)
    # Открываем новый файл для сохранения
    # полученных данных.
    with open(filename, "wb") as f:
        received_bytes = 0
        # Получаем данные из файла блоками по
        # 1024 байта до объема
        # общего количество байт, сообщенных клиентом.
        while received_bytes < filesize:
            chunk = sck.recv(1024)
            if chunk:
                f.write(chunk)
                received_bytes += len(chunk)
with socket.create_server(("localhost", 6190)) as server:
    print("Ожидание клиента...")
    conn, address = server.accept()
    print(f"{address[0]}:{address[1]} подключен.")
    print("Получаем файл...")
    receive_file(conn, "file copy")
    print("Файл получен.")
print("Соединение закрыто.")
0
0 / 0 / 0
Регистрация: 11.11.2019
Сообщений: 28
06.07.2023, 10:34  [ТС]
Semen-Semenich, клиент толком файлы не передает.
Запросы от клиента могут быть следующие:
curl -xget <url>
curl -xput <url>
curl -xpost <url> -d "некоторый json"
curl -xhead <url>

В ответе всегда будет json - отвечает elastic 7 версии.
Проблема в том, что на уровне приклада, который шлет эти запросы к эластику, нет возможности модифицировать как-либо запрос.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.07.2023, 10:34
Помогаю со студенческими работами здесь

Контейнер больших размеров
Иногда приходится решать задачи, где требуется выделить память под огромный массив (более 4 Гб). Тут простым выделением памяти не...

Выделение памяти больших размеров
Помогите написать программу для выделения памяти в Си размером более 2 гб

Работа с изображениями больших размеров
Здравствуйте! Дали задание написать программу для обработки изображений. Но изображение довольно большие, свыше 100 МБ. tiff и...

Массив очень больших размеров
Нужно создать массив размера 4000000 400. Естественно мы получим ошибку &quot;java.lang.OutOfMemoryError: Java heap space&quot; если такое...

Работа с файлами больших размеров
Приветствую!! Есть файл следующего вида: 1e;Moscow;1122334455 2r;Novosibirsk;12321 3b;Kursk;2131 4v;Moscow;5544 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

Новые блоги и статьи
Реализация многопоточных сетевых серверов на Python
py-thonny 16.05.2025
Когда сталкиваешься с необходимостью писать высоконагруженные сетевые сервисы, выбор технологии имеет критическое значение. Python, со своей элегантностью и высоким уровнем абстракции, может. . .
C# и IoT: разработка Edge приложений с .NET и Azure IoT
UnmanagedCoder 16.05.2025
Мир меняется прямо на наших глазах, и интернет вещей (IoT) — один из главных катализаторов этих перемен. Если всего десять лет назад концепция "умных" устройств вызывала скептические улыбки, то. . .
Гибридные квантово-классические вычисления: Примеры оптимизации
EggHead 16.05.2025
Гибридные квантово-классические вычисления — это настоящий прорыв в подходах к решению сложнейших вычислительных задач. Представьте себе союз двух разных миров: классические компьютеры, с их. . .
Использование вебсокетов в приложениях Java с Netty
Javaican 16.05.2025
HTTP, краеугольный камень интернета, изначально был спроектирован для передачи гипертекста с минимальной интерактивностью. Его главный недостаток в контексте современных приложений — это. . .
Реализация операторов Kubernetes
Mr. Docker 16.05.2025
Концепция операторов Kubernetes зародилась в недрах компании CoreOS (позже купленной Red Hat), когда команда инженеров искала способ автоматизировать управление распределёнными базами данных в. . .
Отражение в C# и динамическое управление типами
stackOverflow 16.05.2025
Reflection API в . NET — это набор классов и интерфейсов в пространстве имён System. Reflection, который позволяет исследовать и манипулировать типами, методами, свойствами и другими элементами. . .
Настройка гиперпараметров с помощью Grid Search и Random Search в Python
AI_Generated 15.05.2025
В машинном обучении существует фундаментальное разделение между параметрами и гиперпараметрами моделей. Если параметры – это те величины, которые алгоритм "изучает" непосредственно из данных (веса. . .
Сериализация и десериализация данных на Python
py-thonny 15.05.2025
Сериализация — это своего рода "замораживание" объектов. Вы берёте живой, динамический объект из памяти и превращаете его в статичную строку или поток байтов. А десериализация выполняет обратный. . .
Чем асинхронная логика (схемотехника) лучше тактируемой, как я думаю, что помимо энергоэффективности - ещё и безопасность.
Hrethgir 14.05.2025
Помимо огромного плюса в энергоэффективности, асинхронная логика - тотальный контроль над каждым совершённым тактом, а значит - безусловная безопасность, где безконтрольно не совершится ни одного. . .
Многопоточные приложения на C++
bytestream 14.05.2025
C++ всегда был языком, тесно работающим с железом, и потому особеннно эффективным для многопоточного программирования. Стандарт C++11 произвёл революцию, добавив в язык нативную поддержку потоков,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru