PDA

View Full Version : [JAVA] XMLEncoder: inviare pių oggetti codificati in XML su di un socket


riccardocioria
01-12-2010, 11:21
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 :muro: sbatto la testa, ma purtroppo il server mi rimane bloccato sulla readObject() finchč il client non fa la close sull encoder...

Vi posto il codice:

SERVER:

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



SERVER: HANDLER per ogni client

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



CLIENT:

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