Pergunta

Eu preciso ter como parte de uma aplicação desktop um servidor de arquivos que deve responder o mais rápido possível aos pedidos de transferência de arquivos (de clientes remotos, geralmente localizadas na mesma LAN). Haverá muitas solicitações de arquivos para pequenos arquivos de tamanho. O servidor deve ser capaz de fornecer tanto os serviços de upload e download.

Eu não sou apertado para qualquer tecnologia particual por isso estou aberto a qualquer linguagem de programação, conjuntos de ferramentas, bibliotecas, desde que eles possam ser executados no Windows.

A minha opinião inicial é ir com a implementação de um C / C ++ usando Windows Sockets ou utilizar os serviços prestados pelas bibliotecas como impulso (ASIO ou tal). Eu também ter pensado em Erlang, mas que eu vou ter de aprender e assim os benefícios de desempenho deve justificar o aumento do tempo de desenvolvimento devido a ter de aprender a língua.

EDIT DEPOIS: Eu aprecio as respostas que dizem que o uso de FTP ou HTTP ou basicamente qualquer coisa que já foi criado, mas considerando que você ainda quer escrever um do zero, o que você faria

?
Foi útil?

Solução

Para os envios frequentes de arquivos pequenos, a maneira mais rápida seria a de implementar seu próprio protocolo proprietário, mas isso exigiria uma quantidade considerável de trabalho - e também seria não-padrão, o que significa a futura integração seria difícil a menos que você é capaz de implementar o seu protocolo em qualquer cliente que você vai apoiar. Se você optar por fazê-lo de qualquer maneira, esta é a minha sugestão para um protocolo simples:

  1. Comando: 1 byte para identificar o que vai ser feito:. (0x01 para solicitação de upload, 0x02 para solicitação de download, 0x11 para resposta de upload, 0x12 para a resposta download, etc)
  2. nome do ficheiro: pode ser de tamanho fixo ou prefixado com um byte de comprimento (assumindo que o nome é inferior a 255 bytes)
  3. Checksum, MD5, por exemplo, (se pedido de envio ou resposta download)
  4. Tamanho do arquivo (se o pedido de envio ou resposta download)
  5. carga útil (se o pedido de envio ou resposta download)

Esta poderia ser implementado em cima de um soquete TCP simples. Você também pode usar UDP, evitando o custo de estabelecer uma conexão, mas neste caso você tem que lidar com controle de retransmissão.

Antes de decidir implementar seu próprio protocolo, dê uma olhada HTTP bibliotecas como libcurl, você pode tornar a utilização do servidor comandos HTTP padrão, como GET para download e POST para upload. Isso pouparia muito trabalho e você será capaz de testar o download com qualquer navegador web.

Outra sugestão para melhorar o desempenho é usar como repositório de arquivos e não o sistema de arquivos, mas algo como SQLite. Você pode criar uma única tabela que contém uma coluna de char para o nome do arquivo e uma coluna blob para o conteúdo do arquivo. Desde SQLite é leve e faz um cache eficiente, você vai a maior parte do tempo evitar a sobrecarga de acesso ao disco.

Eu estou supondo que você não precisa de autenticação do cliente.

Finalmente: embora C ++ é a sua preferência para lhe dar velocidade código nativo cru, raramente este é o principal entrave para este tipo de aplicação. Muito provavelmente será o acesso ao disco e largura de banda de rede. Estou mencionando isso porque em Java você provavelmente vai ser capaz de fazer um servlet para fazer exatamente a mesma coisa (usando HTTP GET para download e POST para upload) com menos de 100 linhas de código. Use Derby em vez do SQLite, neste caso, colocar esse servlet em qualquer recipiente (Tomcat, Glassfish, etc) e ele é feito.

Outras dicas

Porque não basta ir com FTP ? Você deve ser capaz de encontrar uma implementação de servidor adequado em qualquer idioma, e bibliotecas de acesso de cliente também.

Parece que um monte de roda-reinvenção. Concedido, FTP não é o ideal, e tem alguns pontos estranhos, mas ... ele está lá, é standard, bem conhecido, e já muito amplamente aplicada.

Se todas as máquinas estão funcionando no Windows na mesma rede local, por que você precisa de um servidor em tudo? Por que não simplesmente usar o compartilhamento de arquivos do Windows?

Eu sugeriria não usar FTP ou SFTP, ou qualquer outra técnica orientada conexão. Em vez disso, ir para um protocolo sem conexão ou técnica.

A razão é que, se você precisar de lotes de pequenos arquivos a serem carregados ou baixados, ea resposta deve ser tão rápido quanto possível, você quer evitar o custo da criação e destruição de conexões.

Gostaria de sugerir que você olhar para qualquer um usando uma implementação existente ou implementar seu próprio servidor HTTP ou HTTPS / serviço.

Seus gargalos são susceptíveis de vir de uma das seguintes fontes:

  • Harddisk I / O - O velociraptor WD é suposto ter uma velocidade de acesso aleatório de cerca de 100MB / s. Além disso, é importante se você configurá-lo como RAID0,1,5 ou o que não têm. Alguns lêem rápido, mas escrever lento. Trade-offs.

  • Rede de I / O - Supondo que você tenha os discos rígidos mais rápidos em uma configuração RAID rápido, a menos que você use Gbit / s, a sua rede será lenta. Se suas tubulações são grandes, você ainda precisa alimentar com os dados.

  • O cache de memória - A in-memória cache do sistema de arquivos precisa ser grande o suficiente para amortecer toda a rede de I / O para que ele não te atrapalhar. Isso vai exigir grandes quantidades de memória para o tipo de trabalho que você está olhando.

  • estrutura de sistema de arquivos - Supondo que você tenha gigabytes valor de memória, então o gargalo provavelmente será a data-estrutura que você usa para o sistema de arquivos. Se a estrutura do sistema de arquivos é pesado ele vai atrasá-lo.

Assumindo que todos os outros problemas são resolvidos, em seguida, fazer você se preocupar com a sua própria aplicação. Note, que a maioria dos gargalos estão fora do seu controle de software. Portanto, se você código-lo em C / C ++ ou bibliotecas específicas de uso, você ainda vai estar à mercê do sistema operacional e hardware.

Parece que você deve usar um SFTP (SSH) servidor , é firewall / seguro NAT, seguro, e já faz o que quiser e muito mais. Você também pode usar SAMBA ou Windows compartilhamento de arquivos para uma implementação ainda mais simples.

Por que não usar algo que existe, por exemplo, um normal alças de servidor Web um monte de arquivos pequenos (imagens) muito bem e rápido.

E muita gente já passou um tempo na otimização do código.

E a segunda vantagem é que a transferência é feita com HTTP que é um protocolo estabelecido. E é facilmente comutada para SSL se você precisar de mais segurança.

Para os uploads, eles também não são um problema com um módulo de script ou costume - com o mesmo método que você também pode adicionar autorização

.

Enquanto você não precisa dinamicamente buscar os arquivos Eu acho que isso seria uma das melhores soluções.

É uma nova parte para uma aplicação de desktop existente? Qual é o objetivo do servidor? Trata-se de proteger os arquivos que são enviados / baixado e fornecendo autenticação e / ou autorização? Será que fornecer algum tipo de estrutura para os envios para ser armazenado em?

Uma opção pode ser a de instalar o Apache HTTP Server na máquina e servir o arquivo via isso. Use POST para carregar e começar a baixar.

Se os clientes estão dentro de uma LAN pode não apenas compartilhar uma unidade?

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