Pregunta

Estoy haciendo un cliente y servidor prototipo para que pueda entender cómo manejar vuelve a conectar. El servidor debe crear un ServerSocket y escuchar siempre. Un cliente puede conectar, enviar sus datos y cerrar su zócalo pero no va a enviar un mensaje "Ya he terminado y el cierre de" tipo al servidor. Por esta razón, el servidor obtiene un EOFException cuando lo hace un readByte() desde el cliente remoto ha cerrado. En el controlador de errores para la SocketWriteError, se cerrará el zócalo y abrir una nueva.

Aquí está el problema: El cliente a veces se pone un outputStream.write() cuando lo hace el <=> llamada, incluso después de que se abre correctamente la toma / flujo de entrada / outpustream. Puede tener algo que ver con la frecuencia que estoy abriendo y cerrando estas tomas. Una cosa interesante es que el cliente hace un número arbitrario de operaciones de escritura / cierre / vuelve a conectar antes de salir cagando. Será veces basura fuera en la primera reconexión, otras veces se tomarán 50 vuelve a conectar antes de ver la <=>.

Aquí está el error en el lado del cliente:

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)

Estos son algunos fragmentos de código:

SERVER:

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

CLIENTE:

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

¿Alguien sabe cómo volver a conectar correctamente?

¿Fue útil?

Solución

No cierre la ServerSocket en un error, simplemente .Accept () una nueva conexión.

Lo que hago normalmente es cada vez ServerSocket.accept () devuelve un socket, lo desovar cerca de un hilo para manejar el envío y recepción de ese socket. De esa manera usted está listo para comenzar a aceptar una nueva conexión tan pronto como alguien quiere conectarse a usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top