C# 通过tcp读取xml数据
我正在开发一个应用程序,它正在侦听tcp以从其他设备获取一些xml数据。 我正在使用嗅探c代码,我可以嗅探所有的数据包。我的问题是,在每个数据包中,我都能找到每个数据包中的一段数据。 像这样: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
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否决票接受我根本没有得到任何数据我得到的是按任意键继续。。。需要帮忙吗?