Может ли сокет получать бесконечный поток данных Python? - PullRequest
0 голосов
/ 11 октября 2018

При попытке перейти на сокет на основе Python у меня есть 2 вопроса, которые я не могу решить.Пожалуйста, помогите мне.Вот мой пример кода сокета:

import socket
import threading
import chardet
bind_ip = '0.0.0.0'
bind_port = 9999

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((bind_ip, bind_port))
server.listen(1)  # max backlog of connections

print (('Listening on {}:{}').format(bind_ip, bind_port))


def handle_client_connection(client_socket):
    request = client_socket.recv(4096 )
    result = chardet.detect(request)
    print(result)
    print (request.decode(result['encoding']))
    client_socket.send('ACK!'.encode(result['encoding']))
    client_socket.close()

while True:
    client_sock, address = server.accept()
    print (('Accepted connection from {}:{}').format(address[0], address[1]))
    client_handler = threading.Thread(
        target=handle_client_connection,
        args=(client_sock,)  # without comma you'd get a... TypeError: handle_client_connection() argument after * must be a sequence, not _socketobject
    )
    client_handler.start()

Выше приведен сервер, а ниже клиент:

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect(('127.0.0.1', 9999))

client.send(str('test data').encode("utf-16"))

response = client.recv(4096)

print(response.decode("utf-16"))

Теперь вопросы:

1) Что означает число в этом утверждении: client.recv(4096)?Что такое 4096, это бит или байт килобайта для получения данных?2) Могу ли я получать бесконечный поток данных через сокет?Это означает, что, поскольку это утверждение client.recv(4096), каким бы ни было значение 4096, может быть байтом, сокет получит только 4096 байтов данных.У меня нет контроля над размером данных, получаемых через сокет, поэтому я могу обобщить его, чтобы он принимал данные любого размера через сокет?

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

1 Ответ

0 голосов
/ 11 октября 2018

Согласно документации «Если сообщение слишком длинное, чтобы поместиться в предоставленный буфер, лишние байты могут быть отброшены в зависимости от типа сокета, из которого получено сообщение».найденный здесь "https://linux.die.net/man/2/recv", который был из документов Python 3.6", максимальный объем данных, которые должны быть получены одновременно, указан в bufsize.См. Страницу руководства по Unix recv (2) «найдено здесь» https://docs.python.org/3.6/library/socket.html", так что это байтовый объект, который может фактически обрезать сообщение в зависимости от протокола.Таким образом, целостность сообщения обрабатывается следующим уровнем вверх.Таким образом, возможно, вы потеряете часть пакета UDP, и вы получите либо повтор, либо дополнительный пакет для TCP, если сообщение слишком велико для размещения в буфере.

...