Pagina 1 di 5 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 46

Discussione: [JAVA] Socket ed XML

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313

    [JAVA] Socket ed XML

    Salve. Vorrei inviare dati xml in un'applicazione client/server.
    Avevo pensato di far in modo che dalla parte del client questi dati vengono trasformati in stringa e dopo essere stati convertiti in array di byte vengono inviati al serversocket.
    Dalla parte del server questi li dovrebbe convertire da byte a stringa e poi a partire da essa ricostruire di nuovo dati xml attraverso le DOM.

    1) Però la vedo troppo laboriosa come cosa. Esiste un metodo più semplice?

    Ho scelto di convertire i dati in byte in quanto mi serve inserire questi dati xml che rappresentano messaggi in una concurrentlinkedqueue.
    I dati XML da inserire possono essere nella coda in un altro formato??

    GRazie anticipatamente per la risposta..

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Nessuna idea?????

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Cosa usi per maneggiare XML? Se ad esempio usi JDOM potresti prendere l'Element che rappresenta la radice del tuo albero e serializzarla :master:
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Vorrei usare JAXP!!!!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tcc
    Vorrei usare JAXP!!!!
    Ok e quale è il dubbio? Dato un org.w3c.dom.Document del tuo XML vuoi serializzarlo (nel senso di scriverlo, non la "serializzazione" di Java) come stream di byte?

    Il modo basilare è quello di usare un Transformer (ottenuto da un TransformerFactory).
    Una volta ottenuto un Transformer invochi il suo transform() a cui devi passare 2 cose:

    - un qualunque javax.xml.transform.Source (in questo caso specifico un DOMSource visto che parti da un Document)
    - un qualunque javax.xml.transform.Result (qui potresti usare un StreamResult costruito passando un File o un qualunque OutputStream o ancora un Writer)

    Vedi il package javax.xml.transform
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Ho provato a leggere i dati dal socket in questo modo e poi a creare xml in questo modo:
    codice:
      
       DataInputStream dataInStream = new DataInputStream(skt.getInputStream());
       receiverBuffer = new byte[1024];
       receiveCorrectBuffer(receiverBuffer);
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      parser = factory.newDocumentBuilder();
      d = parser.parse(new ByteArrayInputStream(receiverBuffer));
      TransformerFactory tf = TransformerFactory.newInstance(); 
      Transformer t;
      t = tf.newTransformer();
      t.transform(new DOMSource(d), new StreamResult(System.out));
    
    con 
    public void  receiveCorrectBuffer(byte[] buffer) throws IOException {
        	ByteBuffer bb = ByteBuffer.wrap(buffer);
        	bb.order(ByteOrder.LITTLE_ENDIAN);    
            	dataInStream.read(buffer, 0, 1024); 
           }
    Ma mi dà il seguente errore:

    codice:
    [Fatal Error] :1:69: Content is not allowed in trailing section.
    org.xml.sax.SAXParseException: Content is not allowed in trailing section.
    	at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
    	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    	at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
    	at sim.engine.rxXML.SimReceiverXML.run(SimReceiverXML.java:116)
    Forse l'errore è nella costruzione del buffer???

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tcc
    Forse l'errore è nella costruzione del buffer???
    Sì. Innanzitutto stai facendo una (1) lettura per al massimo 1024 byte. Quindi se il documento è più di 1024 byte .... ciao.

    Anche se volessimo supporre che il documento sia più corto di 1024 byte, si riempirebbe ovviamente solo una parte di quei 1024 byte nell'array. Già ma poi ByteArrayInputStream lo prende tutto per intero, quindi per lui sono 1024 byte e se c'è meno roba, allora al fondo ci saranno dei caratteri nulli che ovviamente non sarebbero corretti quindi ... altro ciao.

    E tra l'altro il fatto di usare DataInputStream, perlomeno per quel pezzo che vedo, sarebbe inutile. DataInputStream è utile quando devi leggere tipi primitivi da "ricostruire" a partire dai singoli byte nello stream.
    E non capisco perché devi complicarti la vita con i ByteBuffer.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Grazie per la risposta!!!
    Ho tolto
    codice:
    ByteArrayInputStream
    ed ho inserito
    codice:
    parser.parse(new String(receiverBuffer).trim());
    Ma adesso l'errore è il seguente:
    codice:
    java.net.MalformedURLException: no protocol: <root><child1></child1><child2></child2></root>
    	at java.net.URL.<init>(Unknown Source)
    	at java.net.URL.<init>(Unknown Source)
    	at java.net.URL.<init>(Unknown Source)
    	at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)
    	at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source)
    	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    	at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    	at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    	at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
    	at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    	at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
    	at sim.engine.rxXML.SimReceiverXML.run(SimReceiverXML.java:107)
    Dove è il problema??

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da tcc
    ed ho inserito
    codice:
    parser.parse(new String(receiverBuffer).trim());
    Senti, hai un skt.getInputStream() che ti fornisce un InputStream la cui sequenza di byte contiene completamente e unicamente il documento??
    Passa questo InputStream a parse() e basta.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Ho fatto come da te indica, ma purttoppo non riesco a stampare nessun element del DOM.
    Inoltre volevo convertilo in byte in quanto mi serviva per essere inserito in una coda!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.