Problema com Sockets

10 respostas
L

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();
    }

}

10 Respostas

kaique

Cara, verifica a questão de firewall. Pode ser que uma das pontas da conexão esteja protegida com firewall. Aí chapa, nem com reza braba…hehehe
Sério, verifica também a questão da confiabilidade da tua rede…esse caso de perder bytes é meio estranho…

[]'s.

L

o mais estranho é que eu não estou com o firewall habilitado e estou fazendo isso usando a máquina local para fazer os testes…
Algumas vezes perde bytes outras vezes o arquivo chega inteiro …que estranho =\

ViniGodoy

Não tem como perder bytes usando TCP.
Só há duas possibilidades: Ou o programa não está mandando, ou há um erro na lógica recebe os dados.
Mas, definitivamente, o problema não está na conexão TCP. Com certeza o que sai do servidor chega no cliente.

Quanto ao connection reset. Tente responder as seguintes questões:

  1. O seu servidor não caiu?
  2. O seu servidor não cortou a conexão sem cair (as vezes acontece se ele lançar exceção, é bom verificar logs)?
  3. Existe algum equipamento entre você e seu servidor que está caindo? (pode ser em relação a falhas de energia, cabo mal feito, etc)
  4. Existe algum programa provocando a queda? (Firewall, anti-virus, etc)?

Eu desconfio pouco do firewall pq geralmente, se ele estiver ligado, você nem sequer conecta. Mas parece que seu problema ocorreu no meio da conexão, então é mais provavel que seja um dos outros motivos.

ViniGodoy

Sugestão: Baixe o Wireshark e monitore a conexão com ele.
http://www.wireshark.org/

L

valeu pelas respostas pessoal.

Viny, também acho estranho perder dado usando TCP, como vc mesmo disse isso é impossível. O que eu esqueci de dizer é que essa excessão
dá em qualquer hora no meio da transmissão e o estranho é que mesmo após ocorrer isso a conexao não cai e os bytes do servidor continuam chegando…logo a transmissão termina com o arquivo incompleto(se ocorrer a excessão)

L

valeu pela dica do programa, vou dar uma analisada =)

peczenyj

Tem algum proxy no meio ??

lilialnas

ops… estou com o mesmo probleminha…
Desenvolvi um programa q capura imagem de uma webcam (essa parte esta funcionando beleza)
Adicionei no meu programa principal um botao para enviar a foto via socket para o servidor.
Peguei algumas coisas do codigo acima… mas mesmo assim nao funciona nem com reza braba…
Acredito nao ser nhm problema de rede (tcp possui tranferencia confiavel de dados)…
Alguma solucao para o probelma acima me ajudaria tbm!
qql coisa q puder me ajudar, pode mandar por email
[email removido]

Grata,

Lili

KWill

Olhando rapidamente os códigos, me parece que estão faltando as chamadas ao método “flush()”.

Só averiguei isso por ora.

Até mais.

lilialnas

hum… pelo metodo flush eu forco o pacote a sair da memoria…
Qual a diferenca entre implementar o ObjectOutPutStream ou PrintStream e BufferedInputStrem p ObjectInPutStream ??

Grata,

Criado 27 de fevereiro de 2008
Ultima resposta 20 de mai. de 2008
Respostas 10
Participantes 6