- PR -

データセットをネットワークで送受信したい

1
投稿者投稿内容
じじ
会議室デビュー日: 2006/01/16
投稿数: 8
投稿日時: 2006-01-16 13:43
環境:VS2003/C#

いつも勉強させていただいております。

ネットワークでデータセットをやり取りするアプリケーションを作成しています。
やりたいことは
・クライアントで作成したデータセットをサーバに送信
・サーバでデータセットを受け取り、処理
・処理結果をデータセットでクライアントに返す
・処理結果を受け取り、クライアントで処理続行
です。

やっていることはWebサービスで実現できることかもしれませんが、
Windowsアプリケーションとしてサーバを作成する必要があり、
DataSetクラスにある、ReadXml/WriteXmlを使用して実装してみました。

-- サーバ側 --
TcpClient tcpClient = tcpLisner.AcceptTcpClient();
// データ受信
NetworkStream stream = tcpClient.GetStream();
DataSet dataSet = new DataSet();
dataSet.ReadXml(stream); // *1
// 処理
// 結果返信
DataSet resultDataSet = new DataSet();
DataTable dataTable = new DataTable();
dataTable.Rows.Add(new string[]{"0","正常に受信しました!"});
resultDataSet.Tables.Add(dataTable);
resultDataSet.WriteXml(stream);
stream.Flush();
stream.Close();
tcpClient.Close();

-- クライアント側 --
TcpClient tcpClient = new TcpClient("localhost", 9999);
DataSet dataSet = (DataSet)dataGrid1.DataSource;
NetworkStream stream = tcpClient.GetStream();
dataSet.WriteXml(stream);
stream.Flush();

// 処理結果取得
dataSet.ReadXml(stream);
stream.Close();
tcpClient.Close();

問題は、*1の箇所で固まってしまうということです。
私の探し方がまずいのかもしれませんが、TcpClientとDataSetを使用した
サンプルなどが見つけられず、解決できないでいます。

やったこと
・クライアントでWriteXmlをした後、stream.Close()を実行
 ⇒サーバ側で受信でき、データセットとして処理はできる。
  しかし、当然結果の送信は失敗(streamを閉じてしまっているため)
・サーバ側でstream.Readを使用してループで受信
 ⇒成功。ただ、受信したデータをDataSetに変換する方法がわからなかったorz

そもそも使い方が間違っているのか、そんなことは出来ないのか、
何かが足りないのかもわからない状態です。

ご指摘いただけましたら幸いです。
長文失礼致しました。

[ メッセージ編集済み 編集者: じじ 編集日時 2006-01-16 13:57 ]
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-01-16 14:12
引用:

・クライアントでWriteXmlをした後、stream.Close()を実行
 ⇒サーバ側で受信でき、データセットとして処理はできる。
  しかし、当然結果の送信は失敗(streamを閉じてしまっているため)


もう一度受信用ストリームを開けばいいんじゃないですか?


引用:

・サーバ側でstream.Readを使用してループで受信
 ⇒成功。ただ、受信したデータをDataSetに変換する方法がわからなかったorz


データのシリアライズとでシリアライズについて調べましょう
じじ
会議室デビュー日: 2006/01/16
投稿数: 8
投稿日時: 2006-01-16 15:34
かるあ様、ありがとうございます!

引用:

もう一度受信用ストリームを開けばいいんじゃないですか?


はい。そうしたいです。
私のやり方がまずいのかとは思いますが、一度ストリームを閉じたあと、
再度tcpClient.GetStream()をしても
「接続されていないソケットでは実行できない操作です。」となってしまいます。
別な方法で同一接続のストリームは取得できるものなのでしょうか。
※希望としては1接続で送受信を行いたいのです。

引用:

データのシリアライズとでシリアライズについて調べましょう


ありがとうございます。データセットもISerializableを実装しているようですので、
ReadXml/WriteXmlを使わないで、こちらを使用して見たいと思います。
(ReadXml/WriteXmlの実装がこれを使っていたらイタイですけどw

結果が出ましたら再度投稿致します。
じじ
会議室デビュー日: 2006/01/16
投稿数: 8
投稿日時: 2006-01-16 16:10
シリアライズ/デシリアライズにて解決しました。
DataSet.ReadXml/DataSet.WriteXmlを使用せず、実装を行いました。

ネットワークでDataSetを送受信することなんて結構ありそうなのに、
何でReadXmlを使うサンプルがないのかな〜と思っておりました。
単に私が一般的な方法を知らなかっただけだったのですね。

かるあ様、とても助かりました!ありがとうございました!!
1

スキルアップ/キャリアアップ(JOB@IT)