Fila de pacotes em python?
Pergunta
Existe alguma maneira de fazer fila de pacotes para um soquete em Python? Eu tenho procurado algo como o libipq
Biblioteca, mas não consigo encontrar nada equivalente.
Aqui está o que estou tentando realizar:
- Crie conexão de soquete TCP entre o servidor e o cliente (ambos sob meu controle).
- Tente transmitir dados (aguardando a conexão para a falha - por exemplo, o cliente perde a conectividade por causa do fechamento do laptop)
- Truque
SocketException
e segure os dados que estavam tentando ser enviados enquanto mantêm os dados restantes esperando (em uma fila?) - Entre no loop tentando se reconectar (assumindo que o sucesso é inevitável)
- Crie novo soquete após o sucesso
- Retomar a transmissão de dados
Alguma sugestão? Twisted pode fazer isso? Eu preciso envolver pcapy
? Devo fazer isso (soquetes, filas, etc.) em C e usar o Boost para criar código híbrido?
Desde já, obrigado.
Editar 1:
Resposta a Nick:
Deixei de fora o fato de que os dados que transmitirão serão generalizados e sem fim - pense neste aplicativo em uma sessão SSH (não estou de nenhuma maneira tentando espiar os pacotes). Portanto, a transmissão será bilateral. Quero poder ir do escritório para minha casa (fechando meu laptop no meio), abrir o laptop em casa e continuar na minha sessão sem problemas. (Eu sei que a tela existe). Isso pode levar você a se perguntar como funcionaria sem proxies. Não vai, eu não expliquei esse design. Bloco de citação
Com o contexto adicional, também devo dizer que não terei que pegar um SocketException
No lado do servidor, pois essa máquina será (ou assume ser fixa). Quando o cliente descobrir que ele tem conectividade novamente, ele se reconectará ao servidor.
Solução
Sugiro que você implemente um protocolo de aplicativo; portanto, quando o cliente recebe dados, ele o reconhece no servidor, com um número de série para cada bit de dados.
O servidor mantém nota de qual número de série o cliente precisa a seguir e o envia. Se a conexão quebrar, o servidor o relembrará.
Os dados podem ser buffer de qualquer maneira que você quiser, mas eu mantinha simples de começar e usar um deque provavelmente o que é um pouco mais eficiente do que um list
para obter dados do início e fim.
Eu provavelmente criaria um objeto de pacote que possui um atributo de número de série, e uma maneira de serializar e não irializá -lo e seus dados para um fluxo de bytes (por exemplo, usando NetStrings). Você então armazenaria esses pacotes em seu deque. Você tocava o pacote do deque e sempre que recebia um reconhecimento do cliente e enviava o próximo.
Esses protocolos têm muitos casos de canto, os tempos necessários e geralmente são irritantes para depurar. Veja o código -fonte de um servidor SMTP algum dia, se quiser uma ideia!
Quanto aos soquetes, você pode implementar facilmente isso com soquetes normais do Python e ver como vai. Se você planeja ter muitos clientes de uma vez, Twisted será uma boa ideia.