私はC#で単純なクライアントとサーバーを持っています。目標は、クライアントがXML文書をサーバーに送信し、サーバーが別のXML文書で応答する必要があることです。 XmlDocument.Load(NetworkStream)で入力/要求XMLを受信しようとすると、サーバーがブロックされています。NetworkStreamからXMLを読み込むときにサーバーがブロックされるのはなぜですか?
サーバー:
TcpListener t = new TcpListener(IPAddress.Any, 4444);
t.Start();
TcpClient c = t.AcceptTcpClient();
NetworkStream s = c.GetStream();
XmlDocument req = new XmlDocument();
req.Load(s);
string respString = "<response><data>17</data></response>";
XmlDocument resp = new XmlDocument();
resp.LoadXml(respString);
resp.Save(s);
クライアント:
TcpClient t = new TcpClient("localhost", 4444);
NetworkStream s = t.GetStream();
string reqStr = "<request><parameters><param>7</param><param>15</param></parameters></request>";
XmlDocument req = new XmlDocument();
req.LoadXml(reqStr);
req.Save(s);
XmlDocument resp = new XmlDocument();
resp.Load(s);
Console.WriteLine(resp.OuterXml);
それがストリームに要求XmlDocumentオブジェクトを保存した後、私はクライアントに)(フラッシュを追加しようとしたが、それは助けていないようでした。もともと私は、サーバーがクライアントからのすべての入力をMemoryStreamに読み込ませようとしましたが、その後、すべての入力が切断されずに実行されたことをサーバーに示す方法がないことが判明しました。その入力を読んでください。
netcatを使ってファイルからサーバにXML入力を送信できますが、すべて正常に動作します。これは、サーバーでXmlDocument.Load(NetworkStream)を使用するか、すべての入力をMemoryStreamに読み込むかどうかに関係なく機能します。このケースでnetcatが私のC#クライアントでやっていないことは何ですか、そしてC#ではどのようにしますか?私はこれについて別のことをするべきですか?
ファイアウォールはどうですか? – qub1n
ファイアウォールやウイルスチェッカーがポート番号をブロックしているなど、ストリームがブロックされている理由はたくさんあります。 IEウェブブラウザを使ってxmlを手動でダウンロードできるかどうかを最初に確認します。できる場合は、ファイアウォールの問題ではありません。その後、wiresharkやfiddleのようなスニファを使用して、IEのダウンロードをキャプチャし、結果をC#アプリケーションと比較します。通常、問題はIEの結果と一致するように変更する必要があるC#アプリケーションのhttpヘッダーです。 – jdweng
ファイアウォールやネットワークの問題ではありません。同じマシンのnetcatが必要な入力を送信できます。 IEが私のサーバーにXMLリクエストを送信しないので、IEでこのシナリオをテストする方法がわかりません。 – skiphoppy