簡體   English   中英

如何改善從套接字讀取XML的方式

[英]How can I improve how I read XML from Socket

我正在使用通過套接字連接到服務器並發送/接收XML消息的Java客戶端。 我知道消息的架構是什么。 我目前正在使用它,但是感覺很混亂,我還沒有對其進行測試,以查看它如何處理一次從服務器發送的多個XML。

這是代碼:

  private static BufferedReader socketIn;
  private static PrintWriter socketOut;
  private static final String SERVICES_FILE = "/etc/services";

  public static void main(String[] args) {
    int port = getServicePortByName("Service1", "tcp");
    try {
      logger.info("Creating socket port with ip: " + InetAddress.getLocalHost() + " and port: " + port);
      Socket socket = new Socket(InetAddress.getLocalHost(), port);
      socketOut = new PrintWriter(socket.getOutputStream(), true);

      String message = createMessageXML("LOGIN");
      socketOut.println(message);

      socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
      StringBuilder inputLine = new StringBuilder();
      String tmp;

      while (true) {
      //loop to keep listening/parsing
        while(socketIn.ready()) {
          tmp = socketIn.readLine();
          inputLine.append(tmp);
        }
        if(inputLine.length() > 0) {
          parseReceivedMessage(inputLine.toString());
        }
        inputLine.replace(0, inputLine.length(), "");
      }

    } catch (UnknownHostException ex) {
      Logger.getLogger(TestClient.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
      Logger.getLogger(TestClient.class.getName()).log(Level.SEVERE, null, ex);
    }
  }

parseReceivedMessage方法只接受一個String並將其轉換為Document對象。 我的問題是,有沒有更好或更干凈的方法來執行此操作,而不是使用StringBuilder? 我最初想將InputStream傳遞給DOM構建器的parse方法。 我看到了一些使用ByteArray流的示例,但是我遇到了一些問題。 讓我知道是否需要澄清。

ready()不是對消息結尾的有效測試。 擺脫它,然后將StringBuilderreadLine()調用,然后將輸入流直接傳遞到DOM解析器。

我強烈建議您圍繞XML消息設計一個框架協議。 給每個XML消息加上長度值的前綴,該長度值指定要傳輸的字節數,然后發送XML本身(以字節為單位,而不是字符)。 然后,接收方可以讀取長度,然后讀取指定的字節數,並將其傳遞給XML解析器,然后讀取下一個長度,依此類推。 例如:

  private static DataInputStream socketIn;
  private static DataOutputStream socketOut;
  private static final String SERVICES_FILE = "/etc/services";

  public static void main(String[] args) {
    int port = getServicePortByName("Service1", "tcp");
    try {
      logger.info("Creating socket port with ip: " + InetAddress.getLocalHost() + " and port: " + port);
      Socket socket = new Socket(InetAddress.getLocalHost(), port);
      socketIn = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
      socketOut = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));

      byte[] message = createMessageXML("LOGIN");
      socketOut.writeInt(message.length());
      socketOut.write(message, 0, message.length());

      int len = socketIn.readInt();
      if (len > 0)
      {
          message = new byte[len];
          socketIn.readFully(message);
          parseReceivedMessage(message);
      }

    } catch (UnknownHostException ex) {
      Logger.getLogger(TestClient.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
      Logger.getLogger(TestClient.class.getName()).log(Level.SEVERE, null, ex);
    }
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM