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.

Quem souber sobre o assunto,por favor me dê uma ajudinha aê!!!
Grato!!! :roll: :roll: :roll: :roll: :roll: :roll: :roll:
Problemas com Sockets e Streams java
7 Respostas
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.
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.
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:
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.
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();
}
}
}
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?
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)