• 締切済み

SocketでXMLオブジェクトを送信したい

SocketでXMLオブジェクトを送信するにはどうしたら いいのでしょうか。 たとえば、 PrintWriterのprintln("<?xml ~><name></name>") では、XMLオブジェクトを送信したことにはならない ようです。 文字列をXMLに変換するメソッドがあるのか、 その場合の送信は、PrintWriterでできるのか、 とか、分かる人がいましたら教えてください。

みんなの回答

回答No.6

一応、私は趣味でJava歴1ヶ月、ActionScript歴1.5ヶ月なので正しいかどうかは自信がありませんが・・・。 えっと、「telnetでも、onConnectでも接続は、大丈夫そうです。確認があります。」と、いうことですが、こういう理解でよろしいでしょうか。 FlashからJavaで作ったサーバ(以後Javaサーバと略します)にXML形式の文字列は送信できて、Javaサーバも受け取っている。 で、Javaサーバから送られてきた文字列はonConnectイベントハンドラでは抽出することができるが、XMLオブジェとしてうまく受け取れない。 こんな感じでしょうか。 おそらく、そうでしたらFlash側の問題となります。で、この場合は受け取ってはいるもののうまくXMLオブジェとして扱えてないのではないでしょうか。 mySocket = new XMLSocket(); mySocket.allowDomain(); mySocket.onXML = getXML; function getXML( recXML){ trace( recXML ); } これで、表示されるか試してみてください。 「また、送信は、 PrintWtiter out=new PrintWriter(sock.getOutputStream()); out.println("xml"); でいいのでしょうか。」 これについては、私は今まで趣味でPHPやPerlや、1ヶ月ほどならC言語もやったことありますが、他の言語をやっているのなら、出力は print でやった方が違和感がない。と、いうのなら PrintWriterクラスを使って、なれてきたら処理にあった方を使うようにする。と、いうのでよいと思います。 PrintWriterクラスの方が、Stringクラスのオブジェを引数として扱えるメソッド(printメソッドとか)が多いようなので、サーバ側で受け取った値を Stringオブジェにして加工やらチェックやらした場合は、楽かもしれませんね。 ちなみに、私は、 OutputStreamクラスを使っていますが・・・。 で、Javaサーバの方は、「ServerSocket」でいいと思います。(もっといいクラスってあるんですかね(^ ^ ;ゞ) onConnectイベントハンドラで確かに、XMLでなくてもサーバから返ってきた値を受け取ることができますが、FlashからはXMLオブジェにしないと送信できないようです。もし、これでやるとしたら onConnectで受け取る⇒処理⇒XMLオブジェクトに加工⇒送信 って感じになります。

noname#10667
質問者

お礼

お世話になりました。 送信できました。 いろいろ調べたところ、0バイトで終わるデータを 送る、ということだったので、送信テキストの 最後に、\0をつけたところ、送信ができました。 (ptintlnで送信し、onXMLでも、onDataでも取り出せ ます)。 これで、FCSを使わずに、サーバーができます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.5

こんにちわ。 私も2月前半に同じようなものを作ったのですが、やはりうまくいかず悩んでました。 私の場合は、リアルタイムチャットを作りました。クライアントにFlash、サーバにJavaを使用しました。 Javaで作ったサーバが正しく機能するか確認するには、Telnetが便利だと思います。Windowsのコマンドプロンプトから >telnet localhost 10000 こんな感じで、Javaで作ったサーバが稼働しているポートを指定して接続してみてください。 Telnetの方に、XMLオブジェクト?(というより、XMLで記述された文字列だと思いますが)が、返ってくるようなら、Javaのサーバは正常に稼働していると思います。 で、Flashの方ですが、 myXMLSock = new XMLSocket(); myXMLSock.connect(null,10000); と、してコネクションの確立をしてみてください。 connectの第一引数は、Flashでのプレビューによるデバッグ時は、 "localhost" で、ブラウザでデバッグする場合や友達に見てもらう場合は、 null でないとうまく作動しませんでした。 で、ちゃんとFlashが受け取っているかは myXMLSock.onData = function( msg ){ trace(msg); } onDataというイベントハンドラは、XMLだろうがなんだろうが、なにか値を受け取ると作動するようで、受け取った値を、上の例では msg に入れて使う事ができます。 私の場合は、クライアントの誰かが文字列を送信すると、接続されているすべてのクライアントに送られてきた文字列をばらまいたり、誰かがログインするとJavaで作ったサーバでXMLの文字列を作成してやはり他のクライアントにばらまくといった感じで動作します。 興味があれば、おみせします。

noname#10667
質問者

お礼

回答ありがとうございます。 telnetでも、onConnectでも接続は、大丈夫そうです。 確認があります。 JAVAのサーバーは、ServerSocketを使うので いいのでしょうか。 また、送信は、 PrintWtiter out=new PrintWriter(sock.getOutputStream()); out.println("xml"); でいいのでしょうか。 送信は、onDataを使う限りは、xmlである必要は ないのでしょうか。 この点で、問題があれば教えてください。 (せっかくですので、よろしければアドレスでも教えて ください。どんなことが出来るのか、見てみたいです)。

全文を見る
すると、全ての回答が全文表示されます。
  • nieve
  • ベストアンサー率51% (14/27)
回答No.4

Server側からデータがこないとのことですが、Javaで指定したPortNoに接続して、データがきてるかどうかを確認してください。  たとえば、  ServerSocket new ServerSocket(PortNo);  このようにコーディングしていたとします。  PROMPT>telnet ServerHostName PortNo  このようにコマンドを入力してください。    “<?xml ~><name></name>”が表示されますか? また、FLASHに送るXMLはどんな形式でも良いのでしょうか?文字コードなども気になるのですが… ただし『のデータはくるんです』とのことですから、 Socketはつながってるのですよね? もしかすると、flush()を行えば送信されるかもしれません。 また、PrintWriterを使うのはXMLSocketの流儀ですか? No2ではあまり深く考えていませんでしたが、 普通Socketで電文を送信する場合は、   PrintWriter out = new PrintWriter(socket.getOutputStream()); よりも、   OutputStreamWriter out = new OutputStreamWriter(socket.getOutputStream()); の方が一般的だと思います。 もちろん、送信も、println()よりも、write() が一般的だと思います。

参考URL:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/io/OutputStreamWriter.html
noname#10667
質問者

お礼

回答ありがとうございます。 telnetでも確認はとれました。 とにかく情報が少ないので、大変です。

全文を見る
すると、全ての回答が全文表示されます。
  • nieve
  • ベストアンサー率51% (14/27)
回答No.3

少し気になったので、XMLSocketを検索したのですが、 FlashMX用汎用ソケットサーバー(GPSS)これを使うと 下記のようなコードでクライアントとの通信が可能とのことです。 package jp.wda.gpss.samples.chap1; import jp.wda.gpss.GeneralSocklet; import jp.wda.gpss.SocketProcessor; public class HelloWorld extends GeneralSocklet {   public boolean checkConnection(SocketProcessor client) {     client.send("Hello! World.");     return true;   }      public void preRemoveClient(SocketProcessor client) {     sendToAllClients("A client went away...");     return;   }      public boolean doCommand(SocketProcessor client, String command) {     sendToAllClients(command);     return true;   } } 上記コードは下記URLより引用しました。 http://www.geocities.co.jp/SiliconValley-PaloAlto/8242/tutorial/chap1.html

参考URL:
http://www.geocities.co.jp/SiliconValley-PaloAlto/8242/
noname#10667
質問者

お礼

回答ありがとうございます。 No.2の書き方で、できそうなのですが、 データがFLASHに送られません(FLASHのデータは くるんですけど)。 上のサイトは、何度も見ていますが、サーバー側の 記載がよく分からないのです(サーバーも自力で作り たいので)。もう少しがんばってみます。

全文を見る
すると、全ての回答が全文表示されます。
  • nieve
  • ベストアンサー率51% (14/27)
回答No.2

FLASHとのことですので、Socket通信をする上ではJavaがServer側になるとのことですね。 ということは、 import java.io.*; import java.net.*;     : (中略) public void run() {   ServerSocket new ServerSocket(FLASHは何番を使うの?);   Socket socket = server.accept();   PrintWriter out = new PrintWriter(socket.getOutputStream());   out.print("<?xml ~><name></name>");         :(後略 FLASHからの受信データとかもあるよね) こんな感じので良いと思うのですが… また、FLASH用のライブラリなどはのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

何をもってXMLオブジェクトと言っているかわかりませんが、オブジェクトを送受信するならObjectOutputStreamとObjectInputStreamが使えたりします。

noname#10667
質問者

お礼

すいません。 XMLファイル、ということです。 (実は、FLASHのXMLSocketを使いたいのですが、 これが、XMLのデータのやり取りしか出来ないので、 おそらく、XMLファイルを送れ、ということだと、 思うのです。)

noname#10667
質問者

補足

すいません。ちょっと訂正します。 JAVAで、XMLファイルを、送受信する方法が知りたいの で、分かる人がいましたら、お願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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());//サーバから結果が送信されないので、クライアントはここで停止  (略)

    • ベストアンサー
    • Java
  • 文字化けします。

    お世話になります。 ソケットでサーバとクライアントを接続しています。 コーディングの概略は次の通りです。 【クライアント】 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"EUC_JP")); out.println("かきくけこ"); System.out.println(in.readLine()); 【サーバ】 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"Shift_JIS")); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); out.println(inputLine); //←これはクライアントでも文字化けしない。 String s1 = "あいうえお"; String u1 = new String(s1.getBytes("xxxxx"), "yyyyy"); out.println(u1); //←文字化けする。 } お伺いしたいのは文字コード変換についてです。 サーバ:RedhatLinux クライアント:Windowsでして、 サーバ側コーディングの String s1 = "あいうえお"; としている文字列を クライアント側の // 読み込んだデータを表示 System.out.println(in.readLine()); で表示したいのですが、文字が化けて(????←このようになります)困っています。 文字コード変換しなければいけないと思うのですが、 getBytesを使うのでしょうか? もしgetBytesを使うならどのように書けばいいのかがわかりません。 分かりにくい説明で申し訳ありませんが、 ご教授ください。宜しくお願いします。

    • ベストアンサー
    • Java
  • オブジェクト指向で分からないことが。

    オブジェクト指向で分からないことが。 1.クラスAから、文字列引数を指定して、クラスBがインスタンス化されたオブジェクトを取得する。 (getInstance的メソッド)引数の文字列にマッピングされたオブジェクトを取得する感じ。 2.1.で取得したオブジェクトから、各オブジェクトを取得するメソッドを呼び出し、オブジェクトを取得する。(仮にクラスC) 3.2.で取得したクラスCのメソッドを呼び出す。 このとき、クラスCのメソッド内で、1.で利用された引数を利用したいです。 そもそもクラスCは、1.を経てしか取得されないものの為、再度1.の引数を渡したくありません。 内部的な値なので、スコープpublicのセッターを用意して、クラスA内からの書き換えが出来ては困ります。 こういう場合、どういうクラス設計を行えば良いのでしょうか?

    • ベストアンサー
    • Java
  • jqueryでXML内テキストをオブジェクトに

    XML内のテキストをオブジェクトのコンストラクタの引数に渡すことはできますか? 例:(これではできませんでした。) -------------------------------------------------------------- ffdata.xml <?xml version="1.0" encoding="UTF-8" ?> <ffdata> <chardef><!--キャラ登場時のステ(name,hp,mp,str,fig,tec,agi,int,mnd)--> <ch1>アラゴルン,400,80,10,7,8,10,6,6</ch1> </chardef> </ffdata> -------------------------------------------------------------- main.html <script> //************************************************オブジェクト function charctor(name,hp,mp,str,fig,tec,agi,int,mnd){ this.name= name; this.hp = hp; this.mp = mp; this.str = str; this.fig = fig; this.tec = tec; this.agi = agi; this.int = int; this.mnd = mnd; } //************************************************ffdata.xmlファイルを読み込み $(document).ready(function(){ $.ajax({ type: "GET", url: "ffdata.xml", dataType: "xml", success: function(xml) { createObj(xml);}, error: function(){alert("xmlファイルの読み込みに失敗しました");} }); }); //************************************************オブジェクト作成 function createObj(xml){ aragorn = new charctor($(xml).find("chardef").find("ch1").text()); $("#main").html(aragorn.str);//************************#main内に表示 } </script> <body id="main"> </body> ------------------------------------------------------------- 思いつきでやってうまく行かなかったんですが、何か出来そうな気がするんです。 間違いがあったら指摘していたけると助かります。

  • Socket通信でのデータの受け渡し

    サーバーが受けたデータを、クライアントに返す プログラムですが、 サーバーは、クライアントからのデータを、 while(true){ BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream())); str=br.readLine(); if(str!=null){ PrintWriter pr=new PrintWriter(s.getOutputStream()); pr.println(str); pr.flush(); }}で、返すようにしています。 クライアントも大体同じです(PrintWriterは、 Buttonを押した時に、取得しています)。 考え方としては、inputstreamは、無限ループで、 取得し、outputstreamは、必要におうじて、取得し データを送っています。 しかし、これだと、一度データを送ると、次から データの受け渡しが出来なくなります。 socketか、inputstreamかoutputstreamのどれかが、 閉じるか、使えなくなるのだと思いますが、 いつもここで、悩んでいます。 (また、無限ループで、BufferedReaderオブジェクト をつくり続けるというのも、ちょっと不安)。 どこに問題があるのか、分かる人教えてください。 お願いします。

    • ベストアンサー
    • Java
  • Java ファイルオブジェクトでなく文字列オブジェクト?

    JavaでXMLをパースするプログラムを初めて試しています。 parseメソッドの第一引数がファイルオブジェクトなのですが、これをメモリ(文字列)オブジェクトを与えて同じ動作させるものはあるのでしょうか? // SAXパーサーファクトリを生成 SAXParserFactory spfactory = SAXParserFactory.newInstance(); // SAXパーサーを生成 SAXParser parser = spfactory.newSAXParser(); // XMLファイルを指定されたデフォルトハンドラーで処理します parser.parse(new File("helloworld.xml"), new InsXMLParser()); ※このように String str = "<xml? ......"; parser.XXXXXX(str, new InsXMLParser

    • ベストアンサー
    • XML
  • 0バイトの送信

    PrintWriterで終端0バイトになるように送信 したいのですが、疑問があります。 myprintwriter.println("こんにちは\0"); だと、うまくいかないのですが、 myprintwriter.println("こんにちは\0"); myprintwriter.flush(); と、flush()をつけるとうまくいきます。 このflush()はどういう意味なのでしょうか。 ついでですが、printlnだと、最後に改行がつき、 0バイトにならないような気もするのですが、 なぜ、大丈夫なのでしょうか。 なにか分かる人、お願いします。

    • ベストアンサー
    • Java
  • replaceChildメソッドについて

    XMLの扱いがわからなくて困っています。 javaでXMLのノードを変える、例えば、 jspの画面で要素ノードとテキスト名(要素ノードの内容)を入力して 送信ボタンを押したら、要素ノードでノード検索をしてそのテキスト名を 変更するという処理をする場合、replaceChildメソッドを使うのかと 思ったんですが、replaceChildメソッドだと、「既存のノード」しか 置き換えれなくて文字列が指定できません。 この場合、文字列をノードに変換するメソッドがあるのか、それとも 他に方法があるのか教えていただけないでしょうか。 お願いします。 よろしくお願いします。

    • ベストアンサー
    • XML
  • インスタンスNameを文字列で表現するには?

    Object State; public static final Object PLAY=new Object(); public static final Object STOP=new Object(); Sateを操作するメソッド(); : : System.out.println(Object.Stateの文字列表現); としたいのですが、ObjectインスタンスであるPLAYやSTOPをprintlnメソッドで文字列として表現させるにはどうすればいいのでしょうか?コンソールにPLAY,STOPと表示させたいのですが、そのままprintln(State)とすると訳の分からない文字(→java.lang.Object@239137)が出てきます。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • ストリング文字列をDocumentオブジェクトに格納したい

    文字列として受け取ったxmlをDocumentオブジェクトに格納したいと考えて DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(ファイルパス); とすればファイルを取得してDocumentオブジェクトに入れることはできたのですが、ファイルパスではなくString文字列としてxmlを受け取った場合、どのようにすればDocumentオブジェクトに格納できるのかわかりません。 どのようにすればよろしいのでしょうか?

    • ベストアンサー
    • Java