XMLのデータをサーバー(JAVAサーブレット)に送信して処理を行いたいと考えています。
socket(),connect(),send() を使ってデータの送受信(GET)は経験がありますが、XMLデータを送信するにはヘッダや実XMLデータなどをどのようにsend()すればよいのかがわかりません。
どのたかご教示頂ければ大変助かります。
宜しくお願い致します。
XMLデータと言っても単なるデータですから、あなたの好きなようにsend()してください。
サーバ側の受信形式が分からないなら、サーバを作った人に聞いてください。
XMLデータの解析ができないなら、そもそもネットワークとは関係ありません。
どうもありがとうございます。
サーバー側の処理(受信〜解析〜返信)は既に動いています。
(別なクライアント側プログラム(JAVA)からの問い合わせに応答する形で)
それをそのままの形で今度はC++で作成したプログラムから同じ事をしたいのです。
JAVAの場合はXMLを送信してくれるIFがありますので良いのですが、C++の場合は(私の環境下では)send()で送信するしかありません。
この時、ヘッダ部とXMLのデータをどのような形で送信するのかが良くわからずに困っています。
だからそれはあなたにしかわかりません(もしくはサーバを作った人)。
一般的にはC++には全部自動でやってくれるような便利な関数やライブラリはありません。後付で「XMLデータの解析をするライブラリ」等はありますが、自分でどこかから探して持ってくる必要があります。
それが手に入っても結局、
>ヘッダ部とXMLのデータをどのような形で送信するのか
はあなたにしか分かりません。
それって本当に XMLを生でやり取りしているのですか?
ひょっとしてクライアント側で XMLを読み込み埋め込ま
れているデータを、サーバとの間で策定した仕様に従っ
てサーバとの間でキャッチボールしているのではないで
しょうか?
でなければ、XMLファイルって結局全部取り込まないと
データの全体構造が見えないはずなので XMLをクライア
ントからサーバに送るのであればテキストファイルをソ
ケットで送信するのと同様に単に XMLファイルの内容を
クライアントからサーバに投げるだけの話では?
外していたらすみません
Yossiさんどうもありがとうございます。
クライアントからサーバーに送るデータですが、その形式が今ひとつ知識が不足していてます。
ヘッダー+XMLデータを送信しますが、具体的には
GET http://localhost/〜 HTTP/1.1
User-Agent: HJPSampleCode/1.0
Host: localhost
Pragma: no-cache
Accept: */*
Content-Length: 500
Content-Type: text/xml
Connection: close
<?xml version=1.0 〜 以下略
をsend()しています。
この時XMLデータ部の前に空行が1行必要だったようで少し前に進みましたが、まだエラーが出ています。
[Fatal Error] :2:6: The processing instruction target matching "[xX][mM][lL]"
このあたりを今調べているところです。
Content-Length の値はsend()する全体のサイズなのか、それともxmlデータのサイズなのかも良くわかっていません。
教えて頂ければ幸いです。
訂正です
GET http://localhost/〜 HTTP/1.1
ではなく
POST http://localhost/〜 HTTP/1.1
の間違いでした。
特定のアプリ(サーバ)のデータ形式をなぜ見ず知らずの他人が知っていると思うのでしょう?しかもそのアプリの名前や存在場所すら教えずに。
例えば「私の友達が作ったサーバがあるのですが、データ形式が分からないので教えてください」とあなたに聞いたら答えてくれますか?
「そんなの作った奴に聞け」と答えるのが普通でしょ。
Content-Length の値をXMLデータ部のサイズにしたらうまく動作しました。
ラオウさんはいいですよ。
人生の教訓を聞きに来ているのではありません。
HTTPの仕様がわからないならHTTPの仕様書にあたればよい。
http://www.ietf.org/rfc/rfc2616.txt
> The Content-Length entity-header field indicates the size of the
> entity-body, in decimal number of OCTETs, sent to the recipient or,
> in the case of the HEAD method, the size of the entity-body that
> would have been sent had the request been a GET.
ついでに,Content-Typeの値が正しいか,下を参照しておくべきかと。
http://www.ietf.org/rfc/rfc3023.txt
YuOさんどうもありがとうございます。
仰せの通りです。他のパラメータも調べています。
ご指摘、感謝申し上げます。
> ラオウさんはいいですよ。
> 人生の教訓を聞きに来ているのではありません。
ヘタクソな質問に答えてくれてる方にずいぶんと失礼な。
まあまともに質問できてない時点で、私も冷やかし半分だったのでOKですw
クライアント側で正常に動いているJAVAのプログラムとサーバとのやりとりを
パケットモニターでキャプチャして解析されたらいかがでしょうか?
私は通信関係ではまった時はいつもこれで切り抜けています。
> クライアント側で正常に動いているJAVAのプログラムとサーバとのやりとりを
> パケットモニターでキャプチャして解析されたらいかがでしょうか?
それは順番が違いませんか?
HTTPで正しく通信しているはずなのに誤動作する,などの時にとるべき方法だと思います。
もちろん,独自のプロトコル (over HTTP含む) の解析であれば否定しませんが。
HTTPならば,例えばStudying HTTP
http://www.studyinghttp.net/
という非常に役立つサイトが存在します。
RFCという裏付けのある資料 (というより,規格書そのもの) もあるのですから,勘と経験に頼る必要はないでしょう。
むしろHTTPアクセスするためのライブラリをsocketから作るよりも
既存のメジャーなライブラリを使うのが妥当なんじゃないの?
httpだって色々バージョンアップしてるし,
https(ssl/tls)が必要になるかもしれないなら,
要らない部分に本業以上の時間を割かないといけなくなるよね?
といいつつも最初の質問者に'http'の文字が入っていないことに驚いた
サーブレットから想像しろってことか…
YuOさん
>それは順番が違いませんか?
>HTTPで正しく通信しているはずなのに誤動作する,などの時にとるべき方法だと思います。
おっしゃるとおりです。
以前に ある組込機器と通信しなければならない仕事があったのですが
機器に添付されている TELNETっぽい専用通信ソフトで無いと繋がらな
いという問題が発生したときにこの方法を使いました。
その機器は表面的には TELNETでやりとりしているように見えるのですが
パケットモニターでキャプチャすると独自の認証処理をしており通常の
TELNETクライアントの振る舞いでは通信不可でした。
それと自分では正しく送信しているつもりが実は完全ではなかったり
する場合もこの方法で確認する事ができますし、通信に問題なければ
内部処理の問題として切り分けができますのでこういう意味でも有効
な方法と考えています。
PHPをやっている人間の感覚で言うと、
POSTするデータに名前が付いていないのが少し気持ち悪いような。
xml_data=<?xml version=1.0... みたいな感じに。
あとエンコードされてないのも気持ち悪い。
それでも動くのはサーブレットがそういう風にできているのかな。
横槍ですが
JAVAに便利なライブラリがあるのなら
クライアントもJAVAでつくればいい話では…
> JAVAの場合はXMLを送信してくれるIFがありますので良いのですが
ツイート | ![]() |