2

我有一个通过 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;
}
4

1 回答 1

3

这就是问题:

while (PGConnectionStream.DataAvailable);

这只是检查现在是否有任何可用数据。它无法判断以后是否还有更多内容。

目前尚不清楚您是否需要在同一流中容纳多条消息。如果你不这样做,那真的很容易:继续阅读,直到Read返回一个非正值。否则,您需要考虑一种指示数据结束的方案:

  • 分隔符(很难在消息中转义分隔符)
  • 长度前缀(意味着你不能开始写,直到你知道你会得到多少数据)
  • 分块(长度前缀,但在单个块的基础上,用(比如说)一个长度为 0 的块来指示数据的结尾)

(根据 Adriano 的评论,当你真的想同步地做所有事情时使用异步 API 是没有意义的......而且你的变量命名不一致。)

于 2012-10-22T14:23:00.823 回答