Sockets Transmissao de Arquivos

2 respostas
gpmagalhaes

Estou tentando transmitir um arquivo entre dois hosts via Sockets, sendo que compacto a stream com GZIPOutputStream/GZIPInputStream para diminuir o trafego (estou trasmitindo via Internet). Se transmito arquivos de texto plano funciona 100%, se transmito arquivos binarios ele troca varios caracteres p ex. Ï por 9, Ä por }, ê por ã, corrompendo totalmente o arquivo. Se alguem puder ajudar ficaria muito grato.
Segue o codigo dos dois programas:

import java.io.*;
 import java.util.zip.*;
 import java.net.ServerSocket;
 import java.net.Socket;
 public class Servidor {
 	public static void main(String[] args) throws IOException {
 		String nomearq = new String("");
 		String destino = new String("");
 
 		ServerSocket serv = null;
 
 		Socket s = null;
 		BufferedReader entrada = null;
 		serv = new ServerSocket(7000);
 		System.out.println("Aguardando transmissao... ");
 		s = serv.accept();
 		BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(s.getInputStream())));
 		BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream( "d:\temp\teste.txt" ));		
 		int c;
 		while ((c = in.read()) != -1) {
 			out.write(c);
 		}		
 		s.close();
 		serv.close();
 		out.close();
 	}
 }
 
 import java.io.*;
 import java.util.zip.*;
 import java.net.Socket;
 
 // Eu uso: java Cliente <arquivo> <endereco ip destino>
 public class Cliente {
 	public static void main(String[] args) throws IOException {
 
 		Socket s = null;
 		s = new Socket(args[1], 7000);
 
 		BufferedReader in = new BufferedReader(new FileReader(args[0]));
 		BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream(s.getOutputStream()));
 		int c;
 		while ((c = in.read()) != -1) {
 			out.write(c);
 		}
 		in.close();
 		out.close();
 		s.close();
 	}
 }

2 Respostas

T

Não use classes com nomes que começam ou terminam por “Reader”, “Writer” ou “Print” (que são feitas para texto) para tráfego de dados binários. Elas vão fazer isso mesmo. Nem adianta reclamar. Use só as classes que terminam por “Stream” (que são para dados binários).

Aliás, pra que serve encapsular um BufferedInputStream em um BufferedReader? Você vai ter o overhead de 2 buffers, que vão acabar ficando fora de sincronia - você vai ter de fazer “flush” em 2 objetos diferentes.

gpmagalhaes

Você poderia me dar um exemplo como ficaria usando Streams ?

Criado 6 de junho de 2006
Ultima resposta 7 de jun. de 2006
Respostas 2
Participantes 2