Pergunta

Eu estou construindo um .LÍQUIDO de sistema de interacção remota cliente/servidor que vai ser a transmissão de milhares de arquivos, de diversos tamanhos (tudo a partir de poucos bytes para centenas de MB), e eu gostaria de algum feedback sobre o melhor método para atingir este objectivo.Como eu vê-lo, há duas opções:

  • Serializar o arquivo inteiro na minha remoting objeto e transmitir a todos de uma só vez, independentemente do tamanho.Esta seria, provavelmente, o mais rápido, mas uma falha durante a transmissão requer que o arquivo inteiro seja re-transmitidos, com nenhuma forma de retomar.
  • Se o tamanho do arquivo é maior do que algo pequeno (como 4KB), divida-o em blocos de 4KB e remoto aqueles, re-montagem no servidor.Além de toda a complexidade do presente, é mais lento por causa da contínua viagens de ida e volta e agradecimentos, apesar de uma falha de qualquer peça não perca muito tempo.
  • Inclusive algo como um FTP ou SFTP com o meu aplicativo - cliente notificará o servidor que está começando a utilizar de sistema de interacção remota, faça o upload do arquivo e, em seguida, usar o sistema de interacção remota para o notificar de conclusão.Gostaria de conter tudo no meu aplicativo, em vez de exigir um separado do serviço de FTP, mas estou aberto para esta opção se necessário.
  • Usar algum tipo de determinada conexão TCP ou WPF ou algum outro método de transmissão que é construído para lidar com as falhas ou é capaz de fazer algum tipo de ponto de verificação/continuar.
  • Quaisquer outros que eu estou ausente?

O que é mais flexível/confiável método de transmissão?Não estou preocupado com a velocidade, mas mais sobre a confiabilidade - eu quero o arquivo para mover-se, mesmo que lentamente.Uma vez que o cliente e o servidor multi-threaded, eu posso transmitir vários arquivos ao mesmo tempo, se a conexão permite.

Obrigado por seus comentários - eu vou jogar uma recompensa para obter algumas recomendações sobre a forma como as pessoas iriam fazer isso.

Foi útil?

Solução

Bits (serviço de transferência inteligente em segundo plano) é uma boa solução. Tem anos de experiência incorporada

Alguns pontos de partida são

Outras dicas

Embora calmh não responder a pergunta que você está fazendo da camada OSI 4 lado da vida, eu sinto que você está procurando anúncios em camadas aplicativo em sua pergunta.O TCP não definitivamente a lidar com tudo, desde a latência de transmissão, windows, etc, na rede vida.No entanto, ele não determinam diretamente o que acontece se um usuário termina uma sessão de download prematuramente e, em seguida, decide buscá-lo mais tarde de onde foram deixadas.

Para responder a sua questão a partir de um ângulo diferente, eu recomendaria definitivamente chunking o arquivo em seções e indexação-los para todas as ligações, independentemente da velocidade.Em seguida, eles podem ser re-montado novamente no cliente, uma vez que todo o arquivo seja baixado.Isso permite que o usuário pause sessões de download e continuar.

Tão longe como para determinar a velocidade, pode haver métodos de pré-construído para fazer isso, mas um método que você pode usar é apenas criar a sua própria velocidade de teste:Enviar de 1 MB para o cliente (upload) e tem que enviar uma resposta, uma vez recebido.1100 dividido pelo tempo que levou para obter a resposta do cliente, é o KB/s leva o cliente para download a partir do servidor.E vice-versa para o teste de upload do cliente.

Quanto a transmissão, gostaria de recomendar a utilização de tecnologias já existentes. SFTP suporta autenticadas transferência de dados criptografados.Ele é, basicamente, FTP, mas através de SSH.Não deve ser APIs disponíveis em algum lugar para interagir com este.

Em uma nota lateral, eu nunca fiz nada na medida em que você falar, mas espero que as minhas ideias, pelo menos, dar-lhe algumas opções a considerar.

É para isso que é feito o próprio TCP e sintonizado durante décadas ou testes difíceis. O remoto é feito para pequenas chamadas de RPC, não grandes transferências de arquivos. Você deve simplesmente usar um soquete TCP para transmitir os dados e deixar que os protocolos da camada inferior se preocupem com latência, janelas de transmissão, MTU, etc.

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