Problema con comunicazione tramite stream tra client e server + serializzazione [RISOLTO]
Ciao a tutti, sto cimentandomi con la programmazione client-server di base di java, usando il pacchetto java.net.
Ad oggi ho scritto un semplice client ed un semplice server che, teoricamente, dovrebbero comportarsi così:
- Il client invia la stringa "send list" al server
- il server la riceve ed invia al client un oggetto di tipo ArrayList opportunamente creato
Il problema è che, mentre gli stream sembrano venir creati correttamente ed il client invia la richiesta, il server non reagisce minimamente, nel senso che non sembra neanche ricevere il messaggio iniziale del client. Ecco il codice delle due classi (le classi ServerMediator e ClientMediator servono a gestire l'interfaccia grafica che non ho ancora terminato):
Server
Client
Grazie a tutti quei System.out oltre che al debugger di eclipse credo che l'esecuzione del server si fermi appena completato questo blocco
e non capisco perchè ciò avvenga. Mi sarei aspettato al più un'eccezione, ma il silenzio
spero possiate aiutarmi. grazie mille a tutti, vi voglio bene
Ad oggi ho scritto un semplice client ed un semplice server che, teoricamente, dovrebbero comportarsi così:
- Il client invia la stringa "send list" al server
- il server la riceve ed invia al client un oggetto di tipo ArrayList opportunamente creato
Il problema è che, mentre gli stream sembrano venir creati correttamente ed il client invia la richiesta, il server non reagisce minimamente, nel senso che non sembra neanche ricevere il messaggio iniziale del client. Ecco il codice delle due classi (le classi ServerMediator e ClientMediator servono a gestire l'interfaccia grafica che non ho ancora terminato):
Server
public class Server extends Observable { private ServerSocket server; private Socket client; private BufferedReader inFromClient; private ObjectOutputStream outToClient; Calendar date = Calendar.getInstance(); public Server (ServerMediator med) { int port = med.getPort(); //inizializza il server, mettendolo in ascolto sulla porta indicata try { server = new ServerSocket(port); System.out.println("Server creato con successo"); } catch (IOException ex) { System.err.println("Errore durante la creazione del Server"); ex.printStackTrace(); } while (true) { try { // Collego il server ad un client che lo cerchi System.out.println("Sono in attesa di un client"); client = server.accept(); med.addtoConnectionList("Client " + client.getInetAddress() + " - connesso in data "+ date.getTime().toString()); //Creo lo stream di input (dal client al server) e quello di output (dal server al client) inFromClient = new BufferedReader(new InputStreamReader(client.getInputStream())); System.out.println("Stream di input aperto con successo"); outToClient = new ObjectOutputStream(client.getOutputStream()); System.out.println("Stream di output aperto con successo"); String request = inFromClient.readLine(); System.out.println("Ricevuta dal client la richiesta "+ request); //ho delegato ad una classe ausiliaria med il compito di costruire gli oggetti che devono essere dati al client in base alla richiesta outToClient.writeObject(med.answerToRequest(request)); System.out.println("Oggetto inviato al client con successo"); outToClient.flush(); System.out.println("Stream di output flushato con successo"); } catch (IOException ex) { ex.printStackTrace(); } } } public void close(){ // Chiude gli stream di I/O e la connessione try { inFromClient.close(); outToClient.close(); client.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main (String args[]) { ServerMediator m = new ServerMediator(9777); Server s = new Server(m); s.close(); } }
Client
public class Client extends Observable{ Socket socket; ObjectInputStream inFromServer; PrintWriter outToServer; public Client(final ClientMediator med) { String address = med.getAddress(); int port = med.getPort(); try { // Apre una connessione verso un server in ascolto sulla porta indicata. // socket = new Socket (address, port); System.out.println("La connessione è andata a buon fine"); //stream in ingresso inFromServer = new ObjectInputStream(socket.getInputStream()); //stream in uscita outToServer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); System.out.println("Connessione riuscita con l'host " + address); outToServer.write("Send List"); System.out.println("Inviata richiesta al server"); outToServer.flush(); System.out.println("Stream in uscita flushato"); Object o = inFromServer.readObject(); System.out.println("Ricevuta dal server la risposta" + o.toString()); } catch (ConnectException connExc) { System.out.println("Connessione fallita con l'host " + address); } catch (IOException ex) { System.out.println("errore nell'apertura degli stream di I/O"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String args[]) { Client c = new Client(new ClientMediator(9777)); } }
Grazie a tutti quei System.out oltre che al debugger di eclipse credo che l'esecuzione del server si fermi appena completato questo blocco
inFromClient = new BufferedReader(new InputStreamReader(client.getInputStream())); System.out.println("Stream di input aperto con successo"); outToClient = new ObjectOutputStream(client.getOutputStream()); System.out.println("Stream di output aperto con successo");
e non capisco perchè ciò avvenga. Mi sarei aspettato al più un'eccezione, ma il silenzio






Risposte
Ciao, io proverei ad aggiungere alla stringa inviata dal client al server un newline:
Eventualmente prova a testare il server collegandoti via telnet[nota]telnet localhost[/nota], così da escludere che il problema sia lì.
outToServer.write("Send List\n");
Eventualmente prova a testare il server collegandoti via telnet[nota]telnet localhost
Ciao, la dritta sulla newline non ha funzionato... piuttosto, cosa intendi collegandoti via telnet?
scusami, mi rimangio quanto ho detto prima, attualmente aggiungere una newline funziona eccome... ma perchè?!? ti prego spiegamelo non capisco! perchè aggiungere una newline sblocca il prgoramma?!?
Serve un newline a causa di questa istruzione
Prova a chiederti come fa il server a "capire", leggendo tutti i caratteri in ingresso, che gli è stata inviata una riga.
Chiaramente se il server dovesse ricevere un altro tipo di dati/oggetti, allora il newline non servirebbe.
Con il comando telnet puoi simulare una connessione di un client, inviando al server comandi e stringhe a piacere. Devi ovviamente conoscere indirizzo e porta in ascolto del server, ma questi parametri li conosci ovviamente.
String request = inFromClient.readLine()
Prova a chiederti come fa il server a "capire", leggendo tutti i caratteri in ingresso, che gli è stata inviata una riga.

Chiaramente se il server dovesse ricevere un altro tipo di dati/oggetti, allora il newline non servirebbe.
Con il comando telnet puoi simulare una connessione di un client, inviando al server comandi e stringhe a piacere. Devi ovviamente conoscere indirizzo e porta in ascolto del server, ma questi parametri li conosci ovviamente.