TCP / IPを介して別のアプリケーションに接続するクラスがあり、要求を(XMLの形式で)送信し、応答を(XMLの形式で)受信します。
それは機能しますが、私には次の懸念があります。
1)それは任意の理由でのみ機能しSystem.Threading.Thread.Sleep(5000)
ます; これを取り出すと、部分的なデータでクラスの最後に直接ジャンプします。ストリームの最後に到達するか、タイムアウトするまで待つ必要があります。2)あまりエレガントではありません
クラス全体を以下に示します。提案は大歓迎です。
public XDocument RetrieveData()
{
// Initialize Connection Details
TcpClient Connection = new TcpClient();
Connection.ReceiveTimeout = Timeout;
MemoryStream bufferStream = new MemoryStream();
// Compose Request
String Request = "";
Byte[] Data = ASCIIEncoding.ASCII.GetBytes(Request);
// Connect to PG
IAsyncResult ConnectionResult = Connection.BeginConnect(IPAddress, IPPort, null, null);
while (!Connection.Connected)
{
System.Threading.Thread.Sleep(1000);
}
Connection.EndConnect(ConnectionResult);
NetworkStream ConnectionStream = Connection.GetStream();
// Send the request
ConnectionStream.Write(Data, 0, Data.Length);
ConnectionStream.Flush();
// TODO. Tidy this up - Wait to ensure the entire message is recieved.
System.Threading.Thread.Sleep(5000);
// Read the response
StringBuilder Message = new StringBuilder();
byte[] ReadBuffer = new byte[1024];
if (ConnectionStream.CanRead)
{
try
{
byte[] myReadBuffer = new byte[1024];
int BytesRead = 0;
do
{
BytesRead = PGConnectionStream.Read(myReadBuffer, 0, myReadBuffer.Length);
Message.AppendFormat("{0}", Encoding.ASCII.GetString(myReadBuffer, 0, BytesRead));
}
while (PGConnectionStream.DataAvailable);
}
catch
{
}
}
XDocument doc = XDocument.Parse(Message.ToString());
return doc;
}