[Help] Problema com sockets!

Ola Pessoal,

            A muito muito tempo que nao trabalho com sockets, porem ultimamente tive uma situacao em que foi necessaria a utilizacao de sockets, so estou usando porque tenho MESMO que fazer isso em sockets, até ai tudo bem, sem problemas, sockets sao uma das primeiras coisas que aprendemos sobre cliente/servidor em java, porem... diferente de Chuck Norris, a vida de um programador nao é uma aventura sem fim... e as vezes nos deparamos com stacktraces totalmente bizarros como este que irei lhes mostrar agora... o codigo esta bem simples e sem nenhuma funcao maluca, porem deem so uma olhada no stacktrace! para informacao, estou usando o windows 7 ultimate 64 bits.

Aqui esta minha classe Servidor:

public class Serveur {

    private ServerSocket serverSocket;
    private Socket socket;

    private void demarrer() {
        try {
            while(true) {
                serverSocket = new ServerSocket(ServerUtils.getPort());
                serverSocket.setReuseAddress(true);
                
                out.println("==========[ Le serveur est en attende de nouvelles conexions ]==========");
                socket = serverSocket.accept();
                out.println("==========[ Conecté au host: " + socket.getInetAddress() + " ]==========");

                ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());

                Thread listener = new Thread(new ServerListener(ois, oos));
                listener.setName("ServerListener");
                listener.start();
            }
        } catch (IOException ex) {ex.printStackTrace();}
    }

    private class ServerListener implements Runnable {

        private ObjectInputStream ois;
        private ObjectOutputStream oos;

        public ServerListener(ObjectInputStream ois, ObjectOutputStream oos) {
            this.ois = ois;
            this.oos = oos;
        }

        public void run() {
            try {
                while (ois.readObject() != null) {
                    Request request = (Request) ois.readObject();
                    
                    if(request.getRequest().equals("addProduit")) {
                        out.println("serveur reçu: addProduit! ");
                    }
                }
            } catch (IOException ex) {ex.printStackTrace();}
              catch (ClassNotFoundException ex) {ex.printStackTrace();}
        }
    }

    public static void main(String[] args) {
        new Serveur().demarrer();
    }
}

e aqui esta minha classe cliente…

public class TestServerConnection {

    private Socket socket;
    private ObjectOutputStream oos;
    private Request request;
    
    private void testConnexion() {
        try {
            socket = new Socket("localhost", 9999);
            oos = new ObjectOutputStream(socket.getOutputStream());

            request = new Request("addProduit");
            oos.writeObject(request);

        } catch (UnknownHostException ex) {ex.printStackTrace();}
          catch (IOException ex) {ex.printStackTrace();}
    }

    public static void main(String[] args) {
        new TestServerConnection().testConnexion();
    }
}

e aqui o maravilhoso e abençoado stacktrace dos meus pecados… :twisted:

==========[ Le serveur est en attende de nouvelles conexions ]==========
==========[ Conecté au host: /127.0.0.1 ]==========
java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind
        at java.net.PlainSocketImpl.socketBind(Native Method)
        at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:365)
        at java.net.ServerSocket.bind(ServerSocket.java:319)
        at java.net.ServerSocket.<init>(ServerSocket.java:185)
        at java.net.ServerSocket.<init>(ServerSocket.java:97)
        at fr.dds.gestion.server.Serveur.demarrer(Serveur.java:21)
        at fr.dds.gestion.server.Serveur.main(Serveur.java:63)
java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        at java.net.SocketInputStream.read(SocketInputStream.java:182)
        at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2249)
        at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2542)
        at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2552)
        at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297)
        at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
        at fr.dds.gestion.server.Serveur$ServerListener.run(Serveur.java:51)
        at java.lang.Thread.run(Thread.java:619)

Se alguem souber a solucao para este problema, agradeço imensamente, começo a pensar que seja algo ligado ao SO e nao ao codigo… alguem ja passou por este problema?

Abraços a todos!

André Martins

Esse erro pode ocorrer por uma causa, a porta onde você está tentando conectar o servidor não está livre.

a) Se isso ocorre toda vez que você executa o programa, tente trocar a porta. Ela deve estar sendo usada por outro aplicativo. Procure colocar uma porta diferente das muito conhecidas ou utilizadas.
b) Se isso só ocorre na segunda vez que você abre o socket, é porque o SO ainda não liberou a porta, mesmo depois do final da aplicação. Isso é perfeitamente normal. Para livrar-se do problema dê o comando socket.setReuseAddress(true); no seu ServerSocket.

Obrigado pela Resposta ViniGodoy, porem eu havia feito algumas pesquisas no guj e vi que realmente o so poderia estar segurando o socket na segunda tentativa, entao fiz o que voce havia recomendado setando setReausableAddress para true, tambem ja havia pensado nos problemas das portas, ja tentei varias portas, e o erro acontece em todas elas, estou usando kaspersky internet security e tanto o java quanto o ambiente de desenvolvimento estao adicionados com suas devidas excessoes, vou analizar o codigo geral e procurar o erro, assim que encontrar irei postar, pois vi que algumas pessoas passaram pelo mesmo problema…

Obrigado por sua ajuda!

Abraços

André Martins