Newsgroup: it.comp.java
Titolo: problema assurdo con socket

Buongiorno a tutti i lettori.
Ho un problema assurdo con i socket, anzi con un socket in particolare
di una particolare installazione del software.
Lo scenario è questo: ho un'applicazione client server che mette in
comunicazione un vari moduli server e svariati client tramite più
socket (ogni porta server è gestita da un thread server che svolge
operazioni distinte dagli altri thread). I client utilizzano i socket
per ricevere ed inviare informazioni dal server. La comunicazione
avviene completamente in rete locale.
Il problema che ho su una sola di queste installazioni è che un paio
di volte al giorno, in momenti completamente slegati fra loro e
casuali, uno dei moduli server (sempre il medesimo, per fortuna)
rimane impallato per un po' di tempo (da 15 secondi a decine di
minuti) bloccando completamemte tutti le comunicazioni su quella
porta.
L'architattura del modulo server prevede, ovviamente, una accept()
sulla porta e di conseguenza l'instanziazione di un thread per gestire
la richiesta dal client.
In questa fase si verifica il problema. Riporto codice e LOG:
(ho introdotto tutti quei log per individuare il problema senza però
capirci nulla.........sob)
============codice================
client = Vk_Server.accept();
try
{
    log("MultiAccessi :#: nuova RICHIESTA - istanzio Accessi");
    new Accessi(client);
    log("MultiAccessi :#: nuova RICHIESTA - Accessi creato e
attivato");
} catch (IOException e)
{
    log("ISTANZA ACCESSI :#: errore apertura canale - "
                    + e);
}
=================================
============codice================
public Accessi(Socket socket) throws IOException
{
    log("ACCESSI :#: inizializzazione thread");
    this.socket = socket;
    log("ACCESSI :#: [1] recupero InputStream...[  ]");
    InputStream oInStream = socket.getInputStream();
    log("ACCESSI :#: [1] recupero InputStream...[OK]");
    log("ACCESSI :#: [2] recupero OutputStream...[  ]");
    OutputStream oOutStream = socket.getOutputStream();
    log("ACCESSI :#: [2] recupero OutputStream...[OK]");
    log("ACCESSI :#: [3] recupero ObjectInputStream...[  ]");
    inStream = new ObjectInputStream(oInStream);
    log("ACCESSI :#: [3] recupero ObjectInputStream...[OK]");
    log("ACCESSI :#: [4] recupero ObjectOutputStream...[  ]");
    outStream = new ObjectOutputStream(oOutStream);
    log("ACCESSI :#: [4] recupero ObjectOutputStream...[OK]");
    log("ACCESSI :#: avvio thread");
    start();
    log("ACCESSI :#: thread avviato");
}
=================================
quando si verifica il problema, la situazione che trovo nei log è la
seguente:
============log===================
20070612 12.00.41.171 MultiAccessi :#: nuova RICHIESTA - istanzio
Accessi
20070612 12.00.41.171 ACCESSI :#: inizializzazione thread
20070612 12.00.41.171 ACCESSI :#: [1] recupero InputStream...[  ]
20070612 12.00.41.171 ACCESSI :#: [1] recupero InputStream...[OK]
20070612 12.00.41.171 ACCESSI :#: [2] recupero OutputStream...[  ]
20070612 12.00.41.171 ACCESSI :#: [2] recupero OutputStream...[OK]
20070612 12.00.41.171 ACCESSI :#: [3] recupero ObjectInputStream...
[  ]
20070612 12.03.01.437 ISTANZA ACCESSI :#: errore apertura canale -
java.io.EOFException
java.io.EOFException
	at java.io.ObjectInputStream
$PeekInputStream.readFully(ObjectInputStream.java:2165)
	at java.io.ObjectInputStream
$BlockDataInputStream.readShort(ObjectInputStream.java:2634)
	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:
734)
	at java.io.ObjectInputStream.<init>(ObjectInputStream.java:253)
	at cavalierideltau.server.modules.Accessi.<init>(Accessi.java:109)
	at cavalierideltau.server.modules.MultiAccessi.main(MultiAccessi.java:
200)
20070612 12.03.01.437 MultiAccessi :#: nuova RICHIESTA - istanzio
Accessi
<a questo punto riparte tutto normalmente senza nessun intervento>
=================================
Questo è quanto.
Ho ricercato sul Google, sui bug Java (a proposito, JDK 1.4.1_07 non
sostituibile), su al cuni forum, ma nulla.
Come si vede dal log, l'applicazione rimane come frizzata per 2 minuti
e mezzo prima di dare l'eccezione.
Ovviamente dalla parte opposta (client) ho un errore di timeout sulla
connessione e l'applicazione procede senza i dati richiesti.
Se qualcuno sapesse darmi un suggerimento intelligente.....
Grazie e a disposizione per ulteriori informazioni.
Mauro


Cosi'  "a naso" e assumendo che la tua applicazione sia scritta
correttamente ti posso dire che ObjectInputStream e ObjectOutputStream
sono piuttosto "buggati" e quindi la "colpa" potrebbe essere la loro.
Se non si trattasse di un lavoro erculeo potrebbe valer la pena di
riscrivere il codice di rete con i buffer e i channel di NIO...o
comuqnue evitando di usare ObjectInputStream & ObjectOutputStream


Non mi possiamo permettere di riscrivere quei componenti.
Sai mica se esiste una fix del motore JDK che potrebbe risolvere il
problema ?
Considera che ho altre 249 installazioni identiche che non hanno il
problema. All'inizio ipotizzavo un problema di rete e quindi abbiamo
sistemato i cablaggi (sostituiti) ed il server.
Altri suggerimenti ?
Grazie