Newsgroup: it.comp.java
Titolo: Ancora su Client/Server con ObjectInputStream

allora il problema non l'ho risolto, anzi....
il fatto č che vorrei scrivere il codice client del tutto separato dal
server, quindi ho
creato due progetti distinti in JBuilder.
Sia il client che il server hanno una propria Classe Messagge implementata
esattamente
nello stesso modo (tanto che il file .class ha le stesse dimensioni)
e vorrei trasferire un oggetto di questo tipo.
------------------ Client ------------------
package client;
Class Message {
    // campi
}
... main ....
// creo un nuovo messaggio
Message message = new Message();
// ottengo il flusso di output
ObjectOutputStream output  = new ObjectOutputStream(
socket.getOutputStream);
output.flush();
// spedisco il msg
output.writeObject(message);
output.flush()      <--- qui tutto ok
-------------------- Server ------------------
package server;
Class Message {
    // campi
}
..  main ......
ObjectInputStream input = new ObjectInputStream( socket.getInputStream());
try {
    Message message =  (Message) input.readObject();
}
catch ( ClassNotFoundException e) {}   <--- viene rilevata l'eccezione !!!
Se invece di un mio oggetto gli passo un'oggetto della
libreria standard (ad es. una String) tutto funziona!
Non ho provato con altre classi piů complesse ma credo che funzioni
ugualmente.
Insomma la mia classe sembra proprio non piacergli....
Ho trovato vari esempi che funzionano (come anche funzionava un mio
programmino d'esempio), solo che questi esempi funzionanti hanno la
Classe Message che fa parte del progetto insieme al codice
del client e del server!  ... e cosě funziona :-(
Ovvero il progetto č del tipo:
--- Message ---
package shared;
Class Message{}
---- Client ----
package client;
import shared.*;
// send message
---- Server ----
package server;
import shared.*;
// receive message
Un'ultima ma fondamentale cosa: ho poco chiaro come poi dovrei distribuire
il codice funzionante fra applicazione client e server. Il fatto che vorrei
creare e far funzionare due progetti distinti č che al momento
dell'installazione
tutto sarebbe semplice, dato che il client dovrebbe installare solo i file
del
progetto client. Ma se metto client e server entrambi nello stesso progetto
al momento della distribuzione come "strigo" le cose?
grazie

mi rispondo da solo....
ecco il codice funzionante (casomai servisse a qualcuno)
------------------------- il client spedisce il messaggio --------------
try {
        ClientMessage m = new ClientMessage("#connect##","IP","xxx",m_nick);
        System.out.println("Client: sending nickname through
socket:"+m_socket);
        outS = new ObjectOutputStream(new
BufferedOutputStream(m_socket.getOutputStream()));
        outS.flush();
        outS.writeObject(m);
        outS.flush();
      }
      catch (IOException e) {
        e.printStackTrace();
      }
------------------------- il server è in ascolto --------------
while (true) {
try {
        // ogni volta sono "costretto" a reinizializzare input altrimenti
        // solleva l'eccezione StreamCorruptedException !!!
        ObjectInputStream input =  new ObjectInputStream(new
              BufferedInputStream(m_socket.getInputStream()));
        try {
          ClientMessage m = new ClientMessage();
          m = (ClientMessage)input.readObject();
          .....
          }
        catch (StreamCorruptedException sce) {
          sce.printStackTrace();
        }
        catch (ClassNotFoundException cnfe) {
          cnfe.printStackTrace();
        }
     } catch (IOException e) {
         System.out.println("Read failed");
         System.exit(-1);
     }
}
------- IMPORTANTE -----------------
//  la classe ClientMessage non è serializzabile, quindi
// deve essere resa serializzabile (per quindi essere
// spedita attraverso il socket) includendo i metodi
// writeObject e read !!!
public class ClientMessage implements Serializable {
  private String type;
  private String sender;
  private String receiver;
  private String msg;
  public ClientMessage() {
  }
// senza di questi dà ClassNotFoundException !
private void writeObject(ObjectOutputStream stream)
     throws IOException {
      stream.defaultWriteObject();
  }
  private void readObject(ObjectInputStream stream)
     throws IOException, ClassNotFoundException {
      stream.defaultReadObject();
  }
}