• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Socket + XML)

SocketとXMLのプログラムにおける問題と解決方法

このQ&Aのポイント
  • SocketとXMLを使用したプログラムにおいて、サーバ側のInputStreamを引数とするXMLパースメソッドがwaitしてしまい、コネクションを終了させる方法を知りたい。
  • クライアント側のOutputStreamを閉じると、クライアントのソケット自体も閉じてしまうため、一度のコネクションで送受信を終了させたい。
  • 現在はBufferedReaderを利用してXML文章を文字列に落としてからStringReaderを使用してXMLパースを行っているが、よりスマートな方法を探している。

質問者が選んだベストアンサー

  • ベストアンサー
  • haraga
  • ベストアンサー率56% (36/64)
回答No.1

そもそもクライアントからの送信は確認できているのですか?

________j_
質問者

お礼

デバッグで確認できています。 ソケットプログラミングに詳しくなかったのですが、ソケットを閉じない限りInputStreamのストリームの終端が見えないのなら、そもそもパーサに直接ソケットのInputStreamを渡すのはよくない気がしてきました。 なんらかのデータ解析を行ってから、文字列をパーサに渡すべきでしょうか。(HTTPプロトコルのように) たとえば送信時にXML文章の終了記号として "\r\n\0\r\n"を付加し、サーバ側のXMLパーサにInputStream()を直接渡さずにBufferedReaderを利用してその"\0"を検知させることで思ったとおりの送受信が行われます。、 [サーバ] BufferedReader br = new BufferedReader(new InputStreamReader(sock.getInputStream())); String str = ""; for(String line; !(line = br.readLine()).equals("\0");)  str += line;  /* XMLパーサビルダ生成 */  DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();  DocumentBuilder builder = fact.newDocumentBuilder();  /* ドキュメント docIn の解析 */  Document docIn = builder.parse(new InputSource(new StringReader(str)));  (略)  /* 結果ドキュメント docOut の構築*/  Document docOut = builder.newDocument();  (略)  /* docOut 送信 */  TransformerFactory tfactory = TransformerFactory.newInstance();  Transformer transformer = tfactory.newTransformer();  transformer.transform(new DOMSource(docOut), new StreamResult(sock.getOutputStream()));  sock.close(); [クライアント] (略) /* docOut 送信 */  TransformerFactory tfactory = TransformerFactory.newInstance();  Transformer transformer = tfactory.newTransformer();  transformer.transform(new DOMSource(docOut), new StreamResult(sock.getOutputStream())); sock.getOutputStream().write("\r\n\0\r\n".getBytes());  sock.getOutputStream().flush();  /* 結果ドキュメント docIn の解析 */  Document docIn = builder.parse(sock.getInputStream());//サーバ側がsocketをclose()するのでInputStream()の終端も見える  (略)