C# 通过tcp读取xml数据

C# 通过tcp读取xml数据,c#,network-programming,tcpclient,tcplistener,C#,Network Programming,Tcpclient,Tcplistener,我正在开发一个应用程序,它正在侦听tcp以从其他设备获取一些xml数据。 我正在使用嗅探c代码,我可以嗅探所有的数据包。我的问题是,在每个数据包中,我都能找到每个数据包中的一段数据。 像这样: 1 packet from ip41 data:< 2 packet from ip41 data:?xml versi 3 packet from ip41 data:on="1.0" 1 packet from ip35 data:< ?xml 4 packet from ip41

我正在开发一个应用程序,它正在侦听tcp以从其他设备获取一些xml数据。 我正在使用嗅探c代码,我可以嗅探所有的数据包。我的问题是,在每个数据包中,我都能找到每个数据包中的一段数据。 像这样:

1 packet from ip41 data:< 
2 packet from ip41 data:?xml versi 
3 packet from ip41 data:on="1.0" 
1 packet from ip35 data:< ?xml
4 packet from ip41 data:encoding="UTF-8 
<?xml version="1.0" encoding="UTF-8"?><alarm><datetime>2010-07-18T11:14:22Z</datetime><textch><textchid>020</textchid></textch><rule>DIR-020</rule><text>020-DIR-Intersection3_Magles_TCS6</text></alarm> 
来自ip41数据的
1数据包:<
来自ip41数据的2个数据包:?xml版本
3来自ip41数据的数据包:on=“1.0”
来自ip35数据的1个数据包:<?xml
4来自ip41数据的数据包:encoding=“UTF-8
实际数据如下所示:

1 packet from ip41 data:< 
2 packet from ip41 data:?xml versi 
3 packet from ip41 data:on="1.0" 
1 packet from ip35 data:< ?xml
4 packet from ip41 data:encoding="UTF-8 
<?xml version="1.0" encoding="UTF-8"?><alarm><datetime>2010-07-18T11:14:22Z</datetime><textch><textchid>020</textchid></textch><rule>DIR-020</rule><text>020-DIR-Intersection3_Magles_TCS6</text></alarm> 
2010-07-18T11:14:22Z020DIR-020020-DIR-Intersection3\u Magles\u TCS6
我希望能够像真实数据一样以字符串的形式获取数据,而不是以片段的形式获取数据。
在.net中是否有一个方法或库可以做到这一点?

您是在嗅探,还是只想连接到设备并获取数据?如果是后者,您可以使用TcpClient类来完成您需要的操作

using System.Net.Sockets;

TcpClient tcp = new TcpClient(AddressFamily.InterNetwork);
tcp.Connect(IPAddress.Parse("192.168.0.1"), 12345);
然后,
tcp.GetStream()
将为您提供一些东西,您可以将它们输入到您选择的XML解析器中

编辑:这里有一个更详细的示例

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Net.Sockets;
using System.Threading;

namespace ConsoleApplication1 {

    class XMLBlaster {
        Thread myThread;

        public XMLBlaster() {
            myThread = new Thread(Start);
        }

        public void Begin() {
            myThread.Start();
        }

        //This will listen for a connection on port 12345, and send a tiny XML document
        //to the first person to connect.
        protected void Start() {
            TcpListener tcp = new TcpListener(IPAddress.Any, 12345);
            tcp.Start(1);

            TcpClient client = tcp.AcceptTcpClient();

            StreamWriter data = new StreamWriter(client.GetStream());

            data.Write("<myxmldocument><node1><node2></node2></node1></myxmldocument>");

            data.Close();
            client.Close();
        }
    }

    class Program {


        static void Main(string[] args) {

            //this sets up the server we will be reading
            XMLBlaster server = new XMLBlaster();
            server.Begin();


            //this is the important bit

            //First, create the client
            TcpClient tcp = new TcpClient(AddressFamily.InterNetwork);

            //Next, connect to the server. You probably will want to use the prober settings here
            tcp.Connect(IPAddress.Loopback, 12345);

            //Since byte manipulation is ugly, let's turn it into strings
            StreamReader data_in = new StreamReader(tcp.GetStream());

            //And, just read everything the server has to say
            Console.WriteLine(data_in.ReadToEnd());

            //when we're done, close up shop.
            data_in.Close();
            tcp.Close();

            //this is just to pause the console so you can see what's going on.
            Console.WriteLine("Press any key to continue...");
            Console.ReadKey(false);
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统文本;
Net系统;
使用System.IO;
使用System.Net.Sockets;
使用系统线程;
命名空间控制台应用程序1{
类爆炸机{
线程读取;
公共XMLBlaster(){
myThread=新线程(开始);
}
公共空间开始(){
myThread.Start();
}
//这将侦听端口12345上的连接,并发送一个小XML文档
//给第一个连接的人。
受保护的void Start(){
TcpListener tcp=新的TcpListener(IPAddress.Any,12345);
tcp.Start(1);
TcpClient client=tcp.AcceptTcpClient();
StreamWriter data=newstreamwriter(client.GetStream());
数据。写(“”);
data.Close();
client.Close();
}
}
班级计划{
静态void Main(字符串[]参数){
//这将设置我们将要读取的服务器
XMLBlaster服务器=新的XMLBlaster();
server.Begin();
//这是重要的一点
//首先,创建客户机
TcpClient tcp=新的TcpClient(AddressFamily.InterNetwork);
//接下来,连接到服务器。您可能需要在此处使用prober设置
tcp.Connect(IPAddress.Loopback,12345);
//既然字节操作很难看,让我们把它转换成字符串
StreamReader data_in=新的StreamReader(tcp.GetStream());
//而且,只要阅读服务器所说的一切
Console.WriteLine(ReadToEnd()中的数据);
//完成后,关闭商店。
数据_in.Close();
tcp.Close();
//这只是暂停控制台,以便查看发生了什么。
Console.WriteLine(“按任意键继续…”);
Console.ReadKey(false);
}
}
}

请注意,这忽略了您需要遵循的任何协议的问题(例如,如果您通过HTTP(端口80)进行通信,那么在获取数据之前与服务器进行通信需要做大量的工作(还有另一个类可以正确地完成此工作;)

我是通过线程监控一个端口,然后按照序列号组装它们来实现的。
感谢您的帮助

ok的可能副本看起来不错…我想测试它,但我不知道如何解析tcp.GetStream中的数据我尝试了这个NetworkStream NetworkStream=tcpClient.GetStream();byte[]buffer=new byte[180000];string d=NetworkStream.Read(buffer,0,Convert.ToInt32(NetworkStream.Length-1)).ToString()“我有此错误…”此流不支持查找操作。“我是网络编程新手,我不知道这是否可行。你能告诉我如何在文本框或字符串中从网络流中获取数据吗?我添加了一个使用TcpClient的相当详细的示例。作为奖励,您还可以看到服务器的等价物,但您可能不需要注意它:)0否决票接受我根本没有得到任何数据我得到的是按任意键继续。。。需要帮忙吗?