Problemas com Socket

6 respostas
dcbasso

Então pessoal, estou vendo Socket´s e não estou conseguindo fazer rodar o tal socket ae...

Erro:
java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at java.net.SocketInputStream.read(SocketInputStream.java:182)
        at java.io.DataInputStream.readLine(DataInputStream.java:496)
        at br.com.sovis.servidor.ComunicacaoSocket.comunicacao(ComunicacaoSocket.java:51)
        at br.com.sovis.servidor.ComunicacaoSocket.run(ComunicacaoSocket.java:36)
        at br.com.sovis.servidor.ServidorSocket.start(ServidorSocket.java:38)
        at serversocket.Main.main(Main.java:24)
public class ServidorSocket {

    private ServerSocket serverSocket = null;
    private Socket socket = null;
    private ComunicacaoSocket comunicacao = null;
    
    private ConfiguracaoServerSocket configuracao = null;

    public ServidorSocket (ConfiguracaoServerSocket configuracao) {
        this.configuracao = configuracao;
    }

    public void start() {
        try {
            serverSocket = new ServerSocket(configuracao.getPorta());
            System.out.println("Aguardando Conexão... [" + configuracao.getPorta() + "]");
            while (true) {
                socket = serverSocket.accept();
                System.out.println("Conectado a: " + socket.getInetAddress().getHostAddress());
                comunicacao = new ComunicacaoSocket(socket);
                comunicacao.run();
                //accept a connection ;
                //create a thread to deal with the client ;
            }            

        } catch (IOException ex) {
            Logger.getLogger(ServidorSocket.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void stop() {
        try {
            socket.close();
            serverSocket.close();
            socket = null;
            serverSocket = null;

        } catch (IOException ex) {
            Logger.getLogger(ServidorSocket.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
   
}
public class ComunicacaoSocket extends Thread {

    private DataInputStream input = null;
    private DataOutputStream output = null;
    private Socket socket = null;
    private String mensagem = "";
    
    public ComunicacaoSocket(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            
            input = new DataInputStream(socket.getInputStream());
            output = new DataOutputStream(socket.getOutputStream());
            comunicacao();
            System.out.println("Descontado de: " + socket.getInetAddress().getHostAddress());
            output.close();
            input.close();
            socket.close();

        } catch (IOException ex) {
            Logger.getLogger(ComunicacaoSocket.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

    public void comunicacao() throws IOException{
        while (true) {
            mensagem = "";
            mensagem = input.readLine();
            System.out.println("Recebeu: " + mensagem);
        }
        //TODO: Verificar Possibilidade de retornar alguma mensagem para o Cliente
    }

}
public class ClienteSocket {


    public static void main(String[] args) {
        Socket socket = null;
        PrintWriter out = null;
        BufferedReader in = null;
        try {
            socket = new Socket("localhost", 90);
            out = new PrintWriter(socket.getOutputStream());
            //in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out.write("Enviando Dados...");

        } catch (UnknownHostException ex) {
            Logger.getLogger(ClienteSocket.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ClienteSocket.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

}

Alguma coisa simples que não estou percebendo?!?!?!

6 Respostas

dcbasso

Alguem?!

dcbasso

Agora esta dando o seguinte erro, e estou lendo a mensagem do meu CLIENTE!

java.io.EOFException at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:323) at java.io.ObjectInputStream$BlockDataInputStream.readUnsignedShort(ObjectInputStream.java:2764) at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2820) at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1051) at br.com.sovis.servidor.ComunicacaoSocket.comunicacao(ComunicacaoSocket.java:51) at br.com.sovis.servidor.ComunicacaoSocket.run(ComunicacaoSocket.java:37) at br.com.sovis.servidor.ServidorSocket.start(ServidorSocket.java:39) at serversocket.Main.main(Main.java:24)

Linha do erro .04:

public void comunicacao() throws IOException{ while (true) { mensagem = ""; mensagem = input.readUTF(); System.out.println("Recebeu: " + mensagem); } //TODO: Verificar Possibilidade de retornar alguma mensagem para o Cliente }

fguazzel

Honestamente, nem li o programa direito, mas notei que você “lê linhas” mas não “grava linhas”. writeln (ou é println?) muda alguma coisa?

dcbasso

Bem segui o tutorial da SUn… peguei outro agora e da tudo na mesma!
Mudei o Stream de Saida e começou a receber de boa a mensagem… porém, continua dando Exception!

dcbasso

Outro detalhe… fiz novos testes e descobri que ta ocorrendo o seguinte…
O meu CLIENTE faz:

ObjectOutputStream output = new ObjectOutputStream (socket.getOutputStream());

e dai no server para, e dá isso:

SEVERE: null java.net.SocketException: Connection reset at java.net.SocketInputStream.read(SocketInputStream.java:168) at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2266) at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279) at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750) at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280) at br.com.sovis.servidor.t1.Servidor.iniciarServidor(Servidor.java:35) at br.com.sovis.servidor.t1.Servidor.main(Servidor.java:53)

dcbasso

uhauhauhauha acho que achei o problema!!!
Seguinte, a ordem dos fatores altera o produto... vou mandar o resumo do que mudei:

Código Errado:

public Cliente() {
        try {
            socket = new Socket(servidor, porta);
            
            System.out.println("Inciando e Enviado mensagem do Cliente...");
            System.out.println("Conectado: " + socket.isConnected());
            ObjectInputStream input = new ObjectInputStream
            (socket.getInputStream());
            System.out.println("Conectado: " + socket.isConnected());
            ObjectOutputStream output = new ObjectOutputStream
            (socket.getOutputStream());
            System.out.println("Conectado: " + socket.isConnected());
            output.writeObject("enviando dados");
            String message = (String) input.readObject();
            System.out.println("Retornou: " + message);

            socket.close();

        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnknownHostException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Código Certo:

public Cliente() {
        try {
            socket = new Socket(servidor, porta);
            
            System.out.println("Inciando e Enviado mensagem do Cliente...");
            System.out.println("Conectado: " + socket.isConnected());
            System.out.println("Conectado: " + socket.isConnected());
            ObjectOutputStream output = new ObjectOutputStream
            (socket.getOutputStream());
            System.out.println("Conectado: " + socket.isConnected());
            output.writeObject("enviando dados");
            ObjectInputStream input = new ObjectInputStream
            (socket.getInputStream());
            String message = (String) input.readObject();
            System.out.println("Retornou: " + message);

            socket.close();

        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnknownHostException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Enfim, você não pode tentar um INPUT no Cliente antes de fazer um OUTPUT! =]

Criado 9 de fevereiro de 2010
Ultima resposta 9 de fev. de 2010
Respostas 6
Participantes 2