Socket + XML
・クライアントはサーバへXML形式のクエリを送信し、
・サーバからXML形式のデータを受け取る
という単純なプログラムを実装しています。
しかしサーバ側の、InputStreamを引数とするXMLパースメソッドでwaitしてしまって困っています。
かといって、クライアント側のOutputStreamを閉じると、クライアントのソケット自体も閉じてしまいます。
なるべく一度のコネクションで送受信を終了させたいのですが、よい方法はないでしょうか?
一応、BufferedReaderを利用してXML文章を文字列に落としてから
StringReaderをbuilder.parseの引数に与えることで解決出来てはいるのですがスマートではない気がしまして。
[Server側]
ServerSocket server_sock = new ServerSocket(12345);
Socket sock = server_sock.accept();
/* XMLパーサビルダ生成 */
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fact.newDocumentBuilder();
/* ドキュメント docIn の解析 */
Document docIn = builder.parse(sock.getInputStream());//ここから動かない(clientがoutputを終了するまで待っている?)
(略)
/* 結果ドキュメント docOut の構築*/
Document docOut = builder.newDocument();
(略)
/* docOut 送信 */
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer();
transformer.transform(new DOMSource(docOut), new StreamResult(sock.getOutputStream()));
sock.getInputStream().close();
sock.getOutputStream().close();
sock.close();
[Client側]
Socket sock = new Socket("localhost", 12345);
/* XMLパーサビルダ生成 */
DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fact.newDocumentBuilder();
/* クエリドキュメント docOut の構築*/
Document docOut = builder.newDocument();
(略)
/* docOut 送信 */
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer();
transformer.transform(new DOMSource(docOut), new StreamResult(sock.getOutputStream()));
sock.getOutputStream().flush();
//sock.getOutputSream().close();//これにすると、socketが閉じてしまう
/* 結果ドキュメント docIn の解析 */
Document docIn = builder.parse(sock.getInputStream());//サーバから結果が送信されないので、クライアントはここで停止
(略)