【问题标题】:Sending XML Over TCP/IP通过 TCP/IP 发送 XML
【发布时间】:2012-10-22 14:17:18
【问题描述】:

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

【问题讨论】:

  • 如果您只是在同一个线程中等待建立连接,我什至无法理解您为什么要使用 BeginConnect...
  • 而不是等待 5 秒循环,直到您看到“消息结束”或 5 秒(或超时值)结束。一种机制是搜索文档的结束标签,当您看到它时尝试解析...如果通过退出等待...如果不继续等待。

标签: c# xml stream


【解决方案1】:

这就是问题所在:

while (PGConnectionStream.DataAvailable);

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

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

  • 分隔符(很难在消息中转义分隔符)
  • 长度前缀(意味着在知道将获得多少数据之前无法开始编写)
  • 分块(长度前缀,但以单个块为基础,使用(例如)长度为 0 的块表示数据结束)

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

【讨论】:

    猜你喜欢
    • 2016-02-17
    • 1970-01-01
    • 2014-06-05
    • 2016-05-12
    • 2016-07-31
    • 2018-10-24
    • 1970-01-01
    • 2014-07-01
    • 2011-01-07
    相关资源
    最近更新 更多