Problemas com Sockets e Streams java

7 respostas
dalsim

Olá galera,sou novo no forum e estou com um enorme problemão
Eu tenho que desenvolver uma aplicação de chat em java…
até aí já ta pronto,mas só que o meu professor quer que o programa envie e receba arquivos via Socket e eu naum faço a mínima idéia de como implementar isso. :cry: :cry: :cry: :cry: :cry: :cry:
Quem souber sobre o assunto,por favor me dê uma ajudinha aê!!!
Grato!!! :roll: :roll: :roll: :roll: :roll: :roll: :roll:

7 Respostas

ViniGodoy

Ué, só abrir o stream do arquivo e escrever byte a byte no bufferedStream do socket.

Seria uma boa mandar antes um int para o outro lado com o tamanho do arquivo. Assim ele sabe quantos bytes ler.

kaique

Aqui mesmo no GUJ tem um artigo falando sobre isso, comunicação usando Sockets. Você pode encontrá-lo aqui.
As demais dúvidas posta aí que a gente ajuda…

[]'s.

dalsim

Daí surge um problema :Que classes eu devo usar para a transferência do arquivo
Obviamente são FileStreams mas,eu nem sei como funciona o envio…
O professor passou o trabalho e quer que a gente se vire nos 30. :shock:

kaique

Cara, a idéia da transferência de arquivos com Socket é a seguinte: você busca pelos bytes do arquivo que deseja enviar e os escreve no OutputStream do Socket. Do outro lado da sua conexão, você utiliza o InputStream encontrado no Socket para ler as informações enviadas. Sacou??

[]'s.

diego.tk

Dê uma olhada nesse exemplo... ele se conecta no servidor que responde com a sua data.

Cliente:

import java.net.*;
import java.io.*;

public class DayClient2 {
  public static final int DAYTIME_PORT = 13;
  String host;
  Socket s;
 
  public DayClient2(String host) { //Construtor
    this.host = host;
  }

  public void go() throws IOException {
    try {
		s = new Socket(host, DAYTIME_PORT);
    	BufferedReader i = new BufferedReader(new InputStreamReader(s.getInputStream()));
    	System.out.println(i.readLine());
    	i.close();
    	s.close();
  	} 
	catch (UnknownHostException ue) {
		System.out.println("Impossivel conectar ao Servidor. Host desconhecido!");
	}
	catch (ConnectException ce) {
		System.out.println("Impossivel conectar ao Servidor. Sorry!");
		//System.out.println("Mensagem:"+ce.getMessage());
		if (ce.getMessage().contains("Connection timed out"))
			System.out.println("Timeout da tentativa de conectar expirou.");
		else if (ce.getMessage().contains("Connection refused"))
				System.out.println("Conexao recusada pelo Servidor");

	}
  }

  public static void main(String args[]) throws IOException {
   	String name="";

	if (args.length != 0)
		name = args[0];
	else {
	  BufferedReader in = new BufferedReader (new InputStreamReader(System.in));
      try {
		do {
       		System.out.print ("Entre com hostname ou endereco IP: ");
       		System.out.flush ();
       		name = in.readLine ();
    	} while ((name.equals("")) && (!name.equalsIgnoreCase("exit")) );//&& (name != null) );

 	    if (name.equalsIgnoreCase("exit")){
    		System.out.println ("Saionara!");
    		System.exit(0);
		}	

		System.out.println("Conectando...");

	  } catch (NullPointerException ex) {
    	System.out.println ("\n Abandonando...");
    	System.exit(0);
      }
 	}				
	
	DayClient2 rdate = new DayClient2(name);
	rdate.go();
  }//main
}//class

Servidor:

import java.io.*;
import java.net.*;
import java.util.*;

public class DayServer2 {
  public static final int DAYTIME_PORT = 13;
  private ServerSocket ss;

  public static void main(String args[]) throws IOException {
    DayServer2 d = new DayServer2();
    d.go();
  }

  public void go() throws IOException {
    InetAddress myself = InetAddress.getLocalHost(); //Pega o endereço Local
	Socket s = null;
    ss = new ServerSocket(DAYTIME_PORT, 5);
    for (;;) {
      s = ss.accept();
	  System.out.println("Atendendo Cliente: "+ s.getInetAddress().getHostName()+"->"+s.getInetAddress().getHostAddress());
      BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
      out.write("Data e hora em " + myself.getHostName() + ": " + (new Date()).toString() + "\n");
      out.close();
      s.close();
    }
  }
}
dalsim

Eu criei esta classe pra tentar enviar o arquivo via Socket

class FTP{
	
	public FTP() throws NumberFormatException, UnknownHostException, IOException{
		Socket destino=new Socket("localhost", Integer.parseInt("9999"));
		enviarArquivo(destino,"c:\\windows\\desktop\\oi.dun");
		
	}
	/*public boolean getTamanho(InputStream arquivo){
		int size=arquivo.available();
		return size;
	}*/
	
	public static void enviarArquivo(Socket socket,String origem) {
		String nomeDestino="c:\\Temp\\arq1.txt";
	FileInputStream in;
	FileOutputStream out;
	int length;
	byte[] buffer;
	File arquivoOrigem=new File(origem);
	File arquivoDestino=new File(nomeDestino);
	try{
	
		if(arquivoOrigem.exists() && !arquivoDestino.exists()){
		in=new FileInputStream(origem);
		out=new FileOutputStream(arquivoDestino);
	//	buffer=new byte[8192];
		int size=in.available();
		buffer=new byte[size];
		length=in.read(buffer);
		
		while (length!=1){
		out.write(buffer,0,length);
		length=in.read(buffer);
	}
	
	in.close();
	out.flush();
	out.close();
	}	

	}catch(Exception e){
		e.printStackTrace();
        }

um de vcs me deu a dica de enviar o tamanho do arquivo em bytes primeiro para o outro lado da conexão mas,como eu faço isso antes de enviar o arquivo?

dalsim

Bom galera,o meu programa já está quase encaminhado,porém ainda tem um problema:
Eu estou enviando o arquivo usando um buffer de 8196k mas,se eu envio um arquivo maior do que estre tamanho,
o arquivo chega corrompido.
Sei que o problema é com o tamanho do arquivo,mas,como faço pra enviar o seu tamanho para o servidor?
:twisted: :twisted: :twisted: :twisted: :twisted: :twisted: 8) 8) 8)

Criado 1 de novembro de 2008
Ultima resposta 5 de dez. de 2008
Respostas 7
Participantes 4