- - PR -
データセットをネットワークで送受信したい
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||||||
|
投稿日時: 2006-01-16 14:12
もう一度受信用ストリームを開けばいいんじゃないですか?
データのシリアライズとでシリアライズについて調べましょう | ||||||||
|
投稿日時: 2006-01-16 15:34
かるあ様、ありがとうございます!
はい。そうしたいです。 私のやり方がまずいのかとは思いますが、一度ストリームを閉じたあと、 再度tcpClient.GetStream()をしても 「接続されていないソケットでは実行できない操作です。」となってしまいます。 別な方法で同一接続のストリームは取得できるものなのでしょうか。 ※希望としては1接続で送受信を行いたいのです。
ありがとうございます。データセットもISerializableを実装しているようですので、 ReadXml/WriteXmlを使わないで、こちらを使用して見たいと思います。 (ReadXml/WriteXmlの実装がこれを使っていたらイタイですけどw 結果が出ましたら再度投稿致します。 | ||||||||
|
投稿日時: 2006-01-16 16:10
シリアライズ/デシリアライズにて解決しました。
DataSet.ReadXml/DataSet.WriteXmlを使用せず、実装を行いました。 ネットワークでDataSetを送受信することなんて結構ありそうなのに、 何でReadXmlを使うサンプルがないのかな〜と思っておりました。 単に私が一般的な方法を知らなかっただけだったのですね。 かるあ様、とても助かりました!ありがとうございました!! |
1