首页 > 解决方案 > 当您不拥有 Socket 服务器并且看不到它在做什么时,从 Socket Connection 解析输入字符串的最佳方法是什么?

问题描述

我以前发过这个。我对这种情况完全陌生。我精通 M3/MOVEX 专有软件,但我以前从未使用套接字连接到服务器。我已经到了这一点:我可以连接——我可以向服务器发送一个 XML 字符串——我可以得到一个响应并将其放入一个字符串中。我已经尝试过文档生成器来解析它,但是当我这样做时,文档返回为空。

         try {
        //TCPSocket = new Socket("10.33.106.29", 10101);
        //Open the socket connection
        TCPSocket = new Socket("idc-v-pobap02t.ebsco.com", 10101);
        //TCPSocket = new Socket("idc-v-pobap02t", 10101);
        //Initialize the reader and writer for the socket
        is = new BufferedReader(new 
        InputStreamReader(TCPSocket.getInputStream()));
        pw = new PrintWriter(TCPSocket.getOutputStream(), true);

        //Send Data to the socket server 
        if (TCPSocket != null && is != null) {
            pw.println(XMLString + "\n");
            pw.flush();
        }

        ///The 
           while((responseLine = is.readLine()) != null){
             //Do Something
           } 
        //Hangs so I took it out 

        //Read the Data from the socket server.
       responseLine = is.readLine(); //Has my input XML String
       is.close();

      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
      DocumentBuilder builder;
      builder = factory.newDocumentBuilder();
      doc = builder.newDocument();
      doc.setXmlVersion("1.0");
      doc = builder.parse(new InputSource(new 
      StringReader(responseLine)));

我之前也试过这个:

        XMLInputFactory f = XMLInputFactory.newInstance();
        XMLStreamReader r;

        try {
            r = f.createXMLStreamReader(new StringReader(responseLine));
            int eventType = r.next();
            while(r.hasNext()) {
                r.require(XMLStreamReader.START_ELEMENT, null, 
                                                   "TagName");
                if(eventType == XMLStreamConstants.END_ELEMENT){
                    break;
                }

                //EventName = r.getName();
                if(eventType == XMLStreamConstants.CHARACTERS
                    || eventType == XMLStreamConstants.CDATA
                    || eventType == XMLStreamConstants.SPACE
                    || eventType == XMLStreamConstants.ENTITY_REFERENCE) {
                    serverResponse.append(r.getText());
                }

                r.nextTag();
                eventType = r.nextTag();
            }
        } catch (XMLStreamException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

我在这里缺少什么吗?正如我所说,我对此完全陌生,所以如果你回应,请不要假设我知道任何事情。

标签: javasockets

解决方案


我想通了。这就是我所做的 - 它有效,但如果有更好的方法 - 让我知道。

XML 流如下所示:

 <loads>
   <load date="" groupsplitting="allowed" sequencemaxlookahead="0" 
   usesequenceovercontainers="true" containerselectionrule="7" 
   numstagingpositions="0" loadproportionally="false" 
   sequenceiscontainertype="false" customerid="" stage="1" userint1="0"  
   userstring2="" userstring1="" shipdate="" notes="" 
   loadid="2000151290:01001072269" id="2000151290:01001072269"/>
 </loads>


        serverResponse.append(responseLine);    
        DocumentBuilder builder = 
        DocumentBuilderFactory.newInstance().newDocumentBuilder();
        doc = builder.parse(new InputSource(new StringReader(responseLine)));
        doc.getDocumentElement().normalize();
        doc.getDocumentElement().getNodeName();
        Element rootElement = doc.getDocumentElement();
        NodeList sElement = doc.getElementsByTagName("load");
        for (int i = 0; i < sElement.getLength(); i++) {
            Element node = (Element)sElement.item(i);
            NamedNodeMap attributes = node.getAttributes();
            for (int i2 = 0; i2 < attributes.getLength(); i2++) {
                Attr attr = (Attr) attributes.item(i2);
                if(attr.getNodeName() == "loadid"){
                    Delivery = attr.getNodeValue();
                }
            }
        }

推荐阅读