- 締切済み
SocketでXMLオブジェクトを送信したい
SocketでXMLオブジェクトを送信するにはどうしたら いいのでしょうか。 たとえば、 PrintWriterのprintln("<?xml ~><name></name>") では、XMLオブジェクトを送信したことにはならない ようです。 文字列をXMLに変換するメソッドがあるのか、 その場合の送信は、PrintWriterでできるのか、 とか、分かる人がいましたら教えてください。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- campanella_77
- ベストアンサー率66% (35/53)
一応、私は趣味で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オブジェクトに加工⇒送信 って感じになります。
- campanella_77
- ベストアンサー率66% (35/53)
こんにちわ。 私も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の文字列を作成してやはり他のクライアントにばらまくといった感じで動作します。 興味があれば、おみせします。
お礼
回答ありがとうございます。 telnetでも、onConnectでも接続は、大丈夫そうです。 確認があります。 JAVAのサーバーは、ServerSocketを使うので いいのでしょうか。 また、送信は、 PrintWtiter out=new PrintWriter(sock.getOutputStream()); out.println("xml"); でいいのでしょうか。 送信は、onDataを使う限りは、xmlである必要は ないのでしょうか。 この点で、問題があれば教えてください。 (せっかくですので、よろしければアドレスでも教えて ください。どんなことが出来るのか、見てみたいです)。
- nieve
- ベストアンサー率51% (14/27)
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() が一般的だと思います。
お礼
回答ありがとうございます。 telnetでも確認はとれました。 とにかく情報が少ないので、大変です。
- nieve
- ベストアンサー率51% (14/27)
少し気になったので、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
お礼
回答ありがとうございます。 No.2の書き方で、できそうなのですが、 データがFLASHに送られません(FLASHのデータは くるんですけど)。 上のサイトは、何度も見ていますが、サーバー側の 記載がよく分からないのです(サーバーも自力で作り たいので)。もう少しがんばってみます。
- nieve
- ベストアンサー率51% (14/27)
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)
何をもってXMLオブジェクトと言っているかわかりませんが、オブジェクトを送受信するならObjectOutputStreamとObjectInputStreamが使えたりします。
お礼
すいません。 XMLファイル、ということです。 (実は、FLASHのXMLSocketを使いたいのですが、 これが、XMLのデータのやり取りしか出来ないので、 おそらく、XMLファイルを送れ、ということだと、 思うのです。)
補足
すいません。ちょっと訂正します。 JAVAで、XMLファイルを、送受信する方法が知りたいの で、分かる人がいましたら、お願いします。
お礼
お世話になりました。 送信できました。 いろいろ調べたところ、0バイトで終わるデータを 送る、ということだったので、送信テキストの 最後に、\0をつけたところ、送信ができました。 (ptintlnで送信し、onXMLでも、onDataでも取り出せ ます)。 これで、FCSを使わずに、サーバーができます。 ありがとうございました。