Question

Je fais un client de prototype et serveur afin que je puisse comprendre comment gérer reconnecte. Le serveur doit créer un ServerSocket et d'écouter pour toujours. Un client peut se connecter, envoyer ses données et fermer sa prise, mais il ne sera pas envoyer un « Je suis fait et la fermeture » du type de message au serveur. Pour cette raison, le serveur reçoit un quand il fait EOFException un client depuis le readByte() distant a fermé. Dans le gestionnaire d'erreur pour le SocketWriteError, il ferme la douille et ouvrir un nouveau.

Voici le problème: Le client obtient parfois quand il fait outputStream.write() l'appellent même <=> après son ouverture avec succès la prise / inputstream / outpustream. Il peut avoir quelque chose à voir avec la fréquence que je suis l'ouverture et la fermeture de ces prises. Une chose intéressante est que le client fait un nombre arbitraire d'écritures / fermer / reconnecte avant crapping dehors. Il sera parfois la merde sur la première Reconnect, d'autres fois il faudra 50 reconnecte avant de voir le <=>.

Voici l'erreur sur le côté client:

java.net.SocketException: Connection reset by peer: socket write error
       at java.net.SocketOutputStream.socketWrite0(Native Method)
       at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
       at java.net.SocketOutputStream.write(SocketOutputStream.java:115)
       at bytebuffertest.Client.main(Client.java:37)

Voici quelques extraits de code:

SERVEUR:

public static void main(String[] args)
{
    Server x = new Server();
    x.initialize();
}

private void initialize()
{
    ServerSocket s;
    InputStream is;
    DataInputStream dis;
    while (true) //ADDED THIS!!!!!!!!!!!!!!!!!!!!!!
    {
        try
        {
            s = new ServerSocket(4448);
            s.setSoTimeout(0);
            s.setReuseAddress(true);
            is = s.accept().getInputStream();
            System.out.println("accepted client");
            dis = new DataInputStream(is);
            try
            {

                byte input = dis.readByte();
                System.out.println("read: " + input);
            } catch (Exception ex)
            {
                System.out.println("Exception");
                dis.close();
                is.close();
                s.close();
            }
        } catch (IOException ex)
        {
            System.out.println("ioexception");
        }
    }
}

CLIENT:

public static void main(String[] args)
{
    Socket s;
    OutputStream os;
    try
    {
        s = new Socket("localhost", 4448);
        s.setKeepAlive(true);
        s.setReuseAddress(true);
        os = s.getOutputStream();
        int counter = 0;
        while (true)
        {
            try
            {
                os.write((byte) counter++);
                os.flush();

                os.close();
                s.close();

                s = new Socket("localhost", 4448);
                s.setKeepAlive(true);
                s.setReuseAddress(true);
                os = s.getOutputStream();
            } catch (Exception e)
            {
                e.printStackTrace();
                System.err.println("ERROR: reconnecting...");
            }
        }
    } catch (Exception ex)
    {
        ex.printStackTrace();
        System.err.println("ERROR: could not connect");
    }
}

Quelqu'un sait comment bien se reconnecte?

Était-ce utile?

La solution

Ne fermez pas la ServerSocket sur une erreur, juste .Accepter () une nouvelle connexion.

Ce que je fais normalement est chaque ServerSocket.accept de temps () retourne un Socket, je Spawn hors un fil pour gérer envoyer et recevoir de ce Socket. De cette façon, vous êtes prêt à commencer à accepter une nouvelle connexion dès que quelqu'un veut se connecter à vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top