читать данные xml через tcp - PullRequest
1 голос
/ 28 июля 2010

Я занимаюсь разработкой приложения, которое прослушивает 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> 

Я хочу иметь возможность получать данные в виде строки, как реальные данные, а не по частям. есть ли метод или библиотека в .net, которые могут это сделать?

Ответы [ 2 ]

1 голос
/ 25 августа 2010

Я сделал это, контролируя один порт за потоком и собирая их по порядковому номеру. спасибо за вашу помощь

1 голос
/ 28 июля 2010

Вы нюхаете, или вы просто хотите подключиться к устройству и получить данные? Если последнее, вы можете использовать класс 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);
        }
    }
}

Обратите внимание, что это игнорирует проблему любых протоколов, которым вы должны следовать (например, если вы общаетесь через HTTP (порт 80), перед тем как получить данные, требуется много работы для общения с сервером ( есть другой класс, который делает это правильно;))

...