Frage

Ich mache einen Prototyp Client & Server, so dass ich weiß, wie Reconnects zu handhaben. Der Server sollte eine Serversocket erstellen und hören für immer. Ein Client kann eine Verbindung, seine Daten senden, und seine Buchse schließen, aber es wird eine „Ich bin fertig und Schließen“ Typ Nachricht an den Server nicht senden. Aus diesem Grund erhält der Server eine EOFException, wenn er eine readByte() tut, da der Remote-Client geschlossen hat. In der Fehlerbehandlungsroutine für das EOFException, wird es die Buchse schließen und ein neues öffnen.

Hier ist das Problem: Der Kunde bekommt manchmal ein SocketWriteError, wenn es den outputStream.write() Anruf tut, auch wenn er die Fassung / Input / outpustream erfolgreich eröffnet. Es kann etwas mit der Frequenz zu tun hat, dass ich zu öffnen und diese Buchsen schließen. Eine interessante Sache ist, dass der Kunde tut, eine beliebige Anzahl von Schreibvorgängen / close / schließt wieder vor crapping aus. Es wird manchmal auf der ersten Reconnect Mist, es zu anderen Zeiten 50 Reconnects dauern wird, bis die SocketWriteError sehen.

Hier ist der Fehler auf der Client-Seite:

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)

Hier sind einige Code-Schnipsel:

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

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

Wer weiß, wie man richtig wieder?

War es hilfreich?

Lösung

Sie den Serversocket auf einem Fehler nicht schließen, nur .Accept () eine neue Verbindung.

Was ich normalerweise tun ist, jedes Mal ServerSocket.accept () gibt einen Sockel, ich Laichen einen Thread zu handhaben das Senden und Empfangen von diesem Sockel ab. Auf diese Weise Sie bereit sind, um eine neue Verbindung zu akzeptieren, sobald jemand will mit dir verbinden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top