|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Nov 2010
Messaggi: 11
|
[JAVA] XMLEncoder: inviare più oggetti codificati in XML su di un socket
Ragazzi, ciao a tutti.
Ho un problema, ho bisogno di inviare più oggetti su di una socket attrav erso al serializzazione in XML. In pratica ho un client che riceve oggetti di tipo Libro li serializza in XML e li invia al server, il quale, li deserializza e invia una risposta al client. Da quanto ho capito ad ogni oggetto dovrei chiudere l'oggetto XMLEncoder e quindi il relativo XMLDecoder nel server con conseguente chiusura del socket, mi pare veramente assurdo. E' possibile che non si possa tenere aperta la socket e inviare diversi oggetti in diversi tempi utilizzando il metodo flush() dell'encoder??? Sono tre ore che ![]() Vi posto il codice: SERVER: Codice:
package server; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { public Server(int port) { try { ServerSocket serverSocket = new ServerSocket(port); while (true) { System.out.println("In attesa su " + port); Socket socket = serverSocket.accept(); System.out.println("Ricevuta connessione: " + socket.getInetAddress() + ":" + socket.getPort()); (new ClientHandler(socket)).start(); } } catch (IOException e) { e.printStackTrace(); } } } Codice:
package server; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.BufferedWriter; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import libro.Libro; public class ClientHandler extends Thread { Socket socket; public ClientHandler(Socket socket) { this.socket = socket; } public void run() { XMLDecoder decoder = null; BufferedWriter writer = null; try { // creazione degli stream di lettura/scrittura di oggetti dal socket writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); decoder = new XMLDecoder(socket.getInputStream()); while (true) { try { Libro l = (Libro)decoder.readObject(); //riga incriminata // la connessione è stata chiusa fine ciclo if (l == null) break; double costo_medio = l.getCosto() / l.getNumPagine(); // salvo su un file lo stato dell'oggetto OutputStream file = new FileOutputStream("c:\\people.xml"); XMLEncoder fwriter = new XMLEncoder(file); writer.write(l.getNumPagine() + "::" + costo_medio); writer.newLine(); writer.flush(); fwriter.writeObject(l); fwriter.close(); file.close(); } catch (Exception e) { writer.write("Eccezione " + e.getLocalizedMessage()); writer.newLine(); writer.flush(); } } } catch (IOException e) { e.printStackTrace(); } finally { try { if (decoder != null) decoder.close(); if (writer != null) writer.close(); if (socket != null) socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } Codice:
package client; import java.beans.Expression; import java.beans.Statement; import java.beans.XMLEncoder; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; import libro.Libro; public class Client { /** * @param host indirizzo del server * @param port porta di ascolto del server * @throws UnknownHostException * @throws IOException */ public Client(String host, int port) throws UnknownHostException, IOException { BufferedReader keyboardReader = null; BufferedReader reader = null; XMLEncoder encoder = null; Socket socket = null; System.out.println("Connessione al server: " + host + ":" + port + " ..."); //creazione del socket try { socket = new Socket(host, port); System.out.println("Connessoo!"); //creazione degli stream di lettura (tastiera, socket) e scrittura sul socket keyboardReader = new BufferedReader(new InputStreamReader(System.in)); // creazione degli stream di lettura/scrittura di oggetti dal socket //writer = new ObjectOutputStream(socket.getOutputStream()); InputStream is = socket.getInputStream(); reader = new BufferedReader(new InputStreamReader(is)); encoder = new XMLEncoder(socket.getOutputStream()); while (true) { //Serializzazione e invio Libro l = new Libro(); System.out.println("Client: >>> Inserisci l'autore: "); l.setAutore(keyboardReader.readLine()); System.out.println("Client: >>> Inserisci il titolo: "); l.setTitolo(keyboardReader.readLine()); System.out.println("Client: >>> Inserisci il numero di pagine: "); l.setNumPagine(Integer.parseInt(keyboardReader.readLine())); System.out.println("Client: >>> Inserisci il costo: "); l.setCosto(Integer.parseInt(keyboardReader.readLine())); // scrittura del nome del file sul socket Object[] arg = {"a", "b"}; encoder.writeExpression(new Expression("obj","obj",null)); encoder.writeObject(l); encoder.writeExpression(new Expression("/obj","/obj",null)); encoder.flush(); // Ricezione e Deserializzazione String libro = reader.readLine(); String[] info = libro.split("::"); System.out.println(l); System.out.println("Num. di pagine: " + info[0] + "\nCosto medio per pagina: " + info[1]); } } catch (Exception e) { e.printStackTrace(); } finally { // le risorse vengono rilasciate if (keyboardReader != null) keyboardReader.close(); if (reader != null) reader.close(); if (encoder != null) encoder.close(); if (socket != null) socket.close(); } } }
__________________
waiting for : DELL XPS 15, Intel I7 740QM, DDR3 4GB 1333 Mhz, HDD 500G, nVidia 435m GT 2Gb RAM Addio ![]() Ultima modifica di riccardocioria : 01-12-2010 alle 10:24. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:50.