我正在从NVR CCTV机器中提取XML数据。
我使用TCP Listener来获取数据,因为我不知道我合并的字节大小TCP Listener
TcpListener
Network Stream,因为某些客户可能拥有比其他客户更多的摄像头。
每当与NVR机器建立连接时,我会通过{追加它收到的所有数据{1}}到StringBuilder以加快速度并减少使用资源,因为正如我之前所说的,一些客户将拥有比其他客户更多或更少的相机,并且XML数据可能变得非常长。
/>这是GetTcpStreamResult IEnumerable<String>
,它正在提取数据并将其返回到类StringBuilder
private IEnumerable<string> GetTcpStreamResults
{
get
{
Byte[] bytes;
this.TcpListener.Start();
Console.WriteLine("Listening");
TcpClient client = TcpListener.AcceptTcpClient();
Console.WriteLine("Connection Made");
while (true)
{
using (NetworkStream ns = client.GetStream())
{
if (client.ReceiveBufferSize > 0)
{
bytes = new byte[client.ReceiveBufferSize];
ns.Read(bytes, 0, client.ReceiveBufferSize);
yield return String.Format(Encoding.ASCII.GetString(bytes));
}
break;
}
}
}
}
创建类TCPListener
并给出命令后,它将开始监听。
public async Task<bool> StartListeningAsync()
{
foreach (string value in GetTcpStreamResults)
{
this.Xml.AppendLine(value);
}
return await Task.FromResult(true);
}
以下是main
静态无效我如何调用我创建的TCPListener
类。
class Program
{
static void Main()
{
TCPListener TcpListener = new TCPListener(port:23);
Task task = Task.Run(async () =>
{
while (true)
{
await TcpListener.StartListeningAsync();
Console.WriteLine(TcpListener.Xml.ToString());
TcpListener.Xml.Clear();
}
});
Console.ReadLine();
}
}
这是Stringbuilder
字符串结果(我必须删除一些XML数据,因为它太长而无法发布
这是20个相机数据中的一个
Listening
<3 ConnectState="Connected" ConnectState="Loss" Sub="Loss" RW="---------"
Redundancy="---------">
<Alarm Type="Local alarm" Times="0" CurAlarmState="Normal"></Alarm>
<Alarm Type="Network alarm" Times="0" CurAlarmState="Normal"></Alarm>
<Alarm Type="Motion detection" Times="0" CurAlarmState="Normal"></Alarm>
<Alarm Type="Video loss" Times="0" CurAlarmState="Normal"></Alarm>
<Alarm Type="Camera masking" Times="0" CurAlarmState="Normal"></Alarm>
<Alarm Type="Cross detect" Times="0" CurAlarmState="Normal"></Alarm>
<Alarm Type="Intrusion detect" Times="0" CurAlarmState="Normal"></Alarm>
</3>
Listening
{
{1}}
如何删除(Code Above Will Repeat As The NVR machine sends out its data every 60 seconds)
数据底部的空白行,这样我在数据提取之间就不会有太大的差距,因为一旦数据全部有序,
我会转换字符串为XML Document,然后为XmlAttribute,因此我可以创建另一个类
我试过以下但没有成功。
Stringbuilder
还有
static void Main()
{
TCPListener TcpListener = new TCPListener(port:23);
Task task = Task.Run(async () =>
{
while (true)
{
await TcpListener.StartListeningAsync();
string resultString = Regex.Replace(TcpListener.Xml.ToString(), @"^\s+$[\r\n]*", "", RegexOptions.Multiline);
Console.WriteLine(resultString);
TcpListener.Xml.Clear();
}
});
Console.ReadLine();
}
但它的结果仍然相同。