Как я могу собрать объекты из сокета, не закрывая его? (JAXB Marshaling от Inputstream через сокет) - PullRequest
2 голосов
/ 03 мая 2011

Я пытался разными способами отправить свой документ xml через сокетное соединение между сервером и клиентом, не закрывая сокет после отправки (оставьте выходной поток открытым для отправки другого документа).Я нашел несколько сайтов, которые утверждали, что это должно работать, поэтому я попробовал это всеми способами, которые они предложили, но я не нашел способ, который работает.(это описывает то же самое, что я хотел бы сделать: http://jaxb.java.net/guide/Designing_a_client_server_protocol_in_XML.html)

Следующий код работает отлично, если я закрываю сокет после отправки (@code marsh.marshal (element, xsw);), но этозастревает на демаршалинге на стороне сервера, если я пытаюсь оставить сокет открытым.

на стороне клиента ....

public void sendMessage(String message){
         JAXBContext jaxbContext;   
        try {
            jaxbContext = JAXBContext.newInstance("cdl.wizard.library");
            Marshaller marsh = jaxbContext.createMarshaller();
            marsh.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marsh.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.example.org/WizardShema WizardsSchema.xsd");
            ObjectFactory of = new ObjectFactory();
                    // the Dataset is the root element of the xml document
            Dataset set = new Dataset("CONN01", "CONTR", "MCL01@localhost", "SV01@localhost:32000");
            CommandSet cmdSet = new CommandSet();
            Command cmd = new Command();
            cmd.setFunctionName("RegisterAs");
            Param p = new Param();
            p.setString("RemoteClient");
            cmd.addParameter(p);
            cmdSet.addCommand(cmd);
            set.setInstruction(cmdSet);
                    // creates a valid xml dataset, with startDocument, startElement...
            JAXBElement<Dataset> element = of.createData(set);
            XMLStreamWriter xsw = XMLOutputFactory.newInstance().createXMLStreamWriter(mOOS);
            marsh.marshal(element, xsw);
            xsw.flush();
        } catch (JAXBException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XMLStreamException e) {
            e.printStackTrace();
        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
        }

на стороне сервера ....

private void handleMessage() {
        JAXBContext jaxbContext;
        try {
            jaxbContext = JAXBContext.newInstance("cdl.wizard.library") ;
            Unmarshaller um = jaxbContext.createUnmarshaller();
            XMLInputFactory xmlif = XMLInputFactory.newInstance();
            // XMLEventReader xmlr = xmlif.createXMLEventReader(mOIS);
            XMLStreamReader xmlr = xmlif.createXMLStreamReader(mOIS, "UTF8");
            // move to the root element and check its name.
            xmlr.nextTag();
            System.out.println("TagName:" + xmlr.getLocalName());
            xmlr.require(START_ELEMENT, null, "Data");

            JAXBElement<Dataset> obj = um.unmarshal(xmlr, Dataset.class);
            Dataset set = obj.getValue();
            System.out.println("ID:"+ set.getID());

        } catch (JAXBException e) {
            e.printStackTrace();
        } catch (XMLStreamException e) {
            e.printStackTrace();
        } catch (FactoryConfigurationError e) {
            e.printStackTrace();
        }
    }
...