Transferência de arquivos Java por soquetes: envio e recebimento de matrizes de bytes
Em Java, a transferência de arquivos por soquetes envolve a conversão do arquivo em matrizes de bytes, enviando-os através do soquete e, em seguida, convertendo os bytes de volta em um arquivo na extremidade receptora. Este artigo aborda um problema encontrado por um desenvolvedor Java ao implementar esta funcionalidade de transferência de arquivos.
Problema no lado do servidor
O código do servidor parece criar um arquivo vazio ao receber dados do cliente. Para resolver isso, o servidor deve usar um loop para ler os dados enviados pelo cliente em pedaços, usando um buffer para armazenar temporariamente os dados. Depois que todos os dados forem recebidos, o servidor poderá gravar o arquivo completo. O código do servidor corrigido é o seguinte:
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
Problema do lado do cliente
O código do cliente envia inicialmente uma matriz de bytes vazia para o servidor. Para enviar o conteúdo real do arquivo, o seguinte código deve ser usado:
FileInputStream is = new FileInputStream(file);
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);
Código Melhorado
Com as correções mencionadas acima, o código completo para servidor e cliente é o seguinte:
Servidor:
...
byte[] buffer = new byte[1024];
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
FileOutputStream fos = new FileOutputStream("C:\\test2.xml");
int bytesRead = 0;
while ((bytesRead = in.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
fos.close();
...
Cliente:
...
Socket socket = new Socket(host, 4444);
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
File file = new File("C:\\test.xml");
FileInputStream is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
System.out.println("File is too large.");
}
byte[] bytes = new byte[(int) length];
is.read(bytes);
out.write(bytes);
...
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3