Pessoal , eu estou estudando programação usando sockets em Java e estou fazendo,para me familiarizar com o assunto, um programa cliente-servidor simples no qual o servidor envia um arquivo ao cliente, porém na maioria das vezes aparece a segunite exceção:
27/02/2008 13:14:57 SendClient requisitarPhoto
SEVERE: null
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at SendClient.requisitarPhoto(SendClient.java:43)
at SendClient.main(SendClient.java:73)
na maioria das vezes o que acontece é a perda de alguns bytes, mas como isso pode acontecer se estou usando TCP?..ainda estou aprendendo , alguém saberia explicar o motivo da perda de alguns bytes na transferencia de arquivo ? embaixo o código do cliente :
Desde já Obrigado =)
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class SendClient
{
private Socket socketComunicacao;
private BufferedInputStream streamDeEntrada;
private PrintStream streamDeSaida;
private PrintStream streamDeSaidaArquivo;
private byte[] dado=null;
private int qntDados;
public void requisitarPhoto(String nome,String maquina,int porta)
{
try
{
//Criar Socket e Streams de Entrada e Saída
socketComunicacao = new Socket("localhost", 28521);
streamDeEntrada = new BufferedInputStream(socketComunicacao.getInputStream());
streamDeSaida = new PrintStream(socketComunicacao.getOutputStream(),true);
streamDeSaidaArquivo = new PrintStream("/home/alex/Desktop/photo");
dado = new byte[128];
//enviar a requisição ao socket
streamDeSaida.print(nome);
//receber a foto do servidor
while(( qntDados = streamDeEntrada.read(dado,0,128)) != -1)
{
//gravar dados recebidos em um arquivo
streamDeSaidaArquivo.write(dado,0,qntDados);
System.out.println("recebendo dado: " + dado);
}
//encerra as streams e a conexao
streamDeSaidaArquivo.close();
streamDeEntrada.close();
streamDeSaida.close();
streamDeEntrada.close();
socketComunicacao.close();
} catch (UnknownHostException ex) {
Logger.getLogger(SendClient.class.getName()).log(Level.SEVERE, null, ex);
// System.exit(1);
} catch (IOException ex) {
Logger.getLogger(SendClient.class.getName()).log(Level.SEVERE, null, ex);
//System.exit(1);
}
}
public static void main(String[] args)
{
SendClient teste = new SendClient();
teste.requisitarPhoto("foto", "localhost", 28521);
}
}
código do servidor
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
public class SendServer {
//Socket de escuta;
private ServerSocket socketComunicacao;
//Socket de troca de dados
private Socket socketDados;
//Stream de Saída para o socket;
private PrintStream streamDeSaida;
private FileInputStream streamDeEntradaArquivo;
private int dado;
private int qntDados;
private Scanner streamDeEntrada;
public void executar()
{
try {
//Socket de escuta;
socketComunicacao = new ServerSocket(28521);
while (true) {
socketDados = socketComunicacao.accept();
byte[] dado = null ;
dado = new byte[128];
streamDeSaida = new PrintStream(socketDados.getOutputStream());
streamDeEntrada = new Scanner(socketDados.getInputStream());
streamDeEntradaArquivo = new FileInputStream("foto.png");
while((qntDados = streamDeEntradaArquivo.read(dado,0,128)) != -1 )
{
streamDeSaida.write(dado,0,qntDados);
System.out.println(dado);
}
streamDeSaida.close();
streamDeEntrada.close();
streamDeEntradaArquivo.close();
streamDeEntrada.close();
streamDeSaida.close();
socketDados.close();
}
} catch (IOException ex) {
Logger.getLogger(SendServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static void main(String[] args)
{
SendServer teste = new SendServer();
teste.executar();
}
}