Pergunta

Em torcida ao implementar o método dataReceived, não parece haver qualquer exemplos que se referem a pacotes sendo fragmentados. Em todas as outras línguas este é algo que você implementar manualmente, então eu estava me perguntando se isso é feito para você já torcido ou o quê? Se assim for, eu preciso para prefixar meus pacotes com um cabeçalho de comprimento? Ou eu tenho que fazer isso manualmente? Se assim for, o caminho seria isso?

Foi útil?

Solução

No método dataReceived você recebe de volta os dados como uma seqüência de comprimento indeterminado que significa que ele pode ser uma mensagem inteiro em seu protocolo ou pode ser apenas parte da mensagem que alguns 'cliente' enviado a você. Você terá que inspecionar os dados para ver se ele compreende uma mensagem inteiro em seu protocolo.

Atualmente estou usando trançado em um dos meus projetos para implementar um protocolo e decidiu usar o módulo struct para embalar / descompactar os meus dados. O protocolo Estou implementando tem um tamanho de cabeçalho fixo, então eu não construir quaisquer mensagens até que eu tenha lido pelo menos quantidade header_size de bytes. O tamanho total da mensagem é declarada nesta porção de dados do cabeçalho.

Eu acho que você realmente não precisa definir um tamanho da mensagem como parte de seu protocolo mas ajuda. Se você não definir um que você teria que ter um delimitador especial que determina quando uma mensagem começa / extremidades. Classificar de como o protocolo FIX usa o byte SOH a campos delimitam. Embora ele tem um campo obrigatório que lhe diz quanto tempo uma mensagem é (não apenas quantos campos estão em uma mensagem).

Outras dicas

Ao lidar com TCP, você deve realmente esquecer tudo noção de 'pacotes'. O TCP é um protocolo de fluxo - você transmitir dados e fluxos de dados para o outro lado. Uma vez que os dados são enviados, é permitido para chegar em tantas ou tão poucas quadras como ele quer, desde que os dados todos chega na ordem certa. Você vai ter que fazer manualmente a delimitação como com outras línguas, com um campo de comprimento, ou um campo de tipo de mensagem, ou um carácter especial delimitador, etc.

Você também pode usar um protocolo LineReceiver

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top