Получение XML данных по TCP порту - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, Пишу приложение, которое будет получать XML-данные по TCP, а затем писать эти данные в базу данных. Нашёл в интернете пример как отправлять и принимать XML по TCP-порту. Использовал его в своём приложении. XML отправляется, принимается, парсится и пишется в базу только, если прописать сам XML-код в тексте программы. А надо, чтобы программа открывала соединение на указанном порту и прослушивала этот порт, ожидая XML-сообщения от любого приложения (например отправки сообщения по телнету), а затем писала бы это сообщение в базу. Вопрос, как это сделать? Можете ли привести пример кода? Или дать ссылку на реализацию подобной программы. C# знаю слабо, поэтому желательны примеры кода Отправляю то что пока у меня получилось. Спасибо!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using System.Net.Sockets;
using System.Threading;
using System.Xml;

namespace ConsoleApplication2
{
    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(@"<element1>data1</element1>
<element2>data3</element2>
<element3>data3</element3>
<element4>data4</element4>");
 
            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());
            string content = data_in.ReadToEnd();
            //And, just read everything the server has to say
            // Console.WriteLine(content);
 
            using (XmlReader reader = XmlReader.Create(new StringReader(content)))
            {
                reader.ReadToFollowing("element1");
                string element1 = reader.ReadElementContentAsString();
                reader.ReadToFollowing("element2");
                string element2 = reader.ReadElementContentAsString();
                reader.ReadToFollowing("element3");
                string element3 = reader.ReadElementContentAsString();
                reader.ReadToFollowing("element4");
                string element4 = reader.ReadElementContentAsString();
                System.Data.SqlClient.SqlConnection sqlConnection1 =
                new System.Data.SqlClient.SqlConnection("My datasource");
                System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = "My insert SQL-statement";
                cmd.Connection = sqlConnection1;
                sqlConnection1.Open();
                cmd.ExecuteNonQuery();
                sqlConnection1.Close();
 
            }
 
            //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);
 
        }
    }
}

Решение задачи: «Получение XML данных по TCP порту»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Xml;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.IO;
using System.Net.Sockets;
using System.Threading;
using System.Net;
 
namespace WindowsService1
{
 
 
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
            if (!System.Diagnostics.EventLog.SourceExists("MySource"))
            {
                System.Diagnostics.EventLog.CreateEventSource(
                    "MySource", "MyNewLog");
            }
            eventLog1.Source = "MySource";
            eventLog1.Log = "MyNewLog";
 
        }
 
        protected override void OnStart(string[] args)
        {
            System.Threading.Thread newThread =
    new System.Threading.Thread(tcpserver);
            newThread.Start();
 
        }
 
        protected override void OnStop()
        {
            eventLog1.WriteEntry("In OnStop");
            TcpListener server = null;
            // Set the TcpListener on port 13000.
            Int32 port = 13000;
            IPAddress localAddr = IPAddress.Parse("127.0.0.1");
 
            // TcpListener server = new TcpListener(port);
            server = new TcpListener(localAddr, port);
 
            // Stop listening for client requests.
            server.Stop();
 
        }
 
        private delegate void tcpDelegate(String data);     // делегат
        private void tcpserver()
    {
        TcpListener server = null;
        try
        {
        // Set the TcpListener on port 13000.
        Int32 port = 13000;
        IPAddress localAddr = IPAddress.Parse("127.0.0.1");
 
        // TcpListener server = new TcpListener(port);
        server = new TcpListener(localAddr, port);
 
        // Start listening for client requests.
        server.Start();
 
        // Buffer for reading data
        Byte[] bytes = new Byte[512];
        String data = null;
 
        // Enter the listening loop.
        while (true)
        {
 
            // Perform a blocking call to accept requests.
            // You could also user server.AcceptSocket() here.
            TcpClient client = server.AcceptTcpClient();
            //Console.WriteLine("Connected!");
 
            data = null;
 
            // Get a stream object for reading and writing
            NetworkStream stream = client.GetStream();
 
            int i;
 
            // Loop to receive all the data sent by the client.
            while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
            {
                // Translate data bytes to a ASCII string.
                data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                tcpDelegate td = InsertIntoBase;
                IAsyncResult asynchRes = td.BeginInvoke(data, null, null);
                // Process the data sent by the client.
                data = data.ToUpper();
                byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
                // Send back a response.
                stream.Write(msg, 0, msg.Length);
 
            }
 
            // Shutdown and end connection
            client.Close();
        }
        }
        catch (SocketException e)
        {
            Console.WriteLine("SocketException: {0}", e);
        }
    }
 
        static void InsertIntoBase(String data)
        {
            // запись в базу
 
            using (XmlReader reader = XmlReader.Create(new StringReader(data)))
            {
                reader.ReadToFollowing("element1");
                string element1 = reader.ReadElementContentAsString();
                reader.ReadToFollowing("element2");
                string element2 = reader.ReadElementContentAsString();
                reader.ReadToFollowing("element3");
                string element3 = reader.ReadElementContentAsString();
                reader.ReadToFollowing("element4");
                string element4 = reader.ReadElementContentAsString();
                System.Data.SqlClient.SqlConnection sqlConnection1 =
                new System.Data.SqlClient.SqlConnection("My datasource");
                System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = "My insert SQL-statement";
                cmd.Connection = sqlConnection1;
                sqlConnection1.Open();
                cmd.ExecuteNonQuery();
                sqlConnection1.Close();
 
            }
        }
 
    }
 
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.6 из 5