gpt4 book ai didi

c# - 通过 TCP/IP 发送 XML

转载 作者:行者123 更新时间:2023-11-30 22:24:01 25 4
gpt4 key购买 nike

我有一个类通过 TCP/IP 连接到另一个应用程序发送请求(以 XML 的形式)并接收响应(也是以 XML 的形式)。

它确实有效,但我有以下问题:

1) 它只因为任意的 System.Threading.Thread.Sleep(5000) 而起作用;如果我把它拿出来,它会直接跳到带有部分数据的类(class)末尾。我需要它等到它到达流的末尾或超时。2) 不是很优雅

下面列出了整个类(class),欢迎提出任何建议。

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;
}

最佳答案

问题是:

while (PGConnectionStream.DataAvailable);

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

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

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

(根据 Adriano 的评论,当您真的想同步执行所有操作时使用异步 API 毫无意义……而且您的变量命名也不一致。)

关于c# - 通过 TCP/IP 发送 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13013339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com