чтение xml-файла на другом компьютере с использованием c#

#c# #.net #sockets

#c# #.net #сокеты

Вопрос:

Извините за мой плохой английский. У меня есть 2 компьютера с именами «компьютер A» и «компьютер B», оба находятся в локальной сети. У меня есть 2 проекта. 1 на компьютере A, а другой на компьютере B. Компьютер B имеет «info.xml «файл в папке проекта bin. Я хочу, чтобы проект A мог читать этот файл с использованием C #. Какой метод мне следует использовать? Спасибо, что уделили мне время. Это мой код «Computer A»

 namespace Client
{
    class Program
    {
        private const int BUFFER_SIZE = 1024;
        private const int PORT_NUMBER = 7826;
        public static string xmlsvinfo = Directory.GetCurrentDirectory()   "\data\serverinfo.xml";
        public static string xmlpath = Directory.GetCurrentDirectory()   "\data\gamesinfo.xml";
        static ASCIIEncoding encoding = new ASCIIEncoding();
        static void Main(string[] args)
        {
            try
            {
                // IPAddress address = IPAddress.Parse("127.0.0.1");
                IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), PORT_NUMBER);

                Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                client.Connect(iep);
                string command = "checkupdate";
                while (!command.Equals("quit"))
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(xmlsvinfo);
                    XmlNode node = doc.SelectSingleNode(@"root/UPDATE");
                    string clupdate = node.InnerText;
                    // gui lenh
                    if (command == "update")
                    {
                        XmlDocument docx = new XmlDocument();
                        docx.Load(xmlpath);
                        docx.DocumentElement.RemoveAll();
                        docx.Save(xmlpath);
                        string[] mtam = new string[4];
                        client.Send(encoding.GetBytes(command));
                        for (int i = 0; i < 4; i  )
                            {
                                byte[] data = new byte[BUFFER_SIZE];
                                int rec = client.Receive(data);
                                mtam[i] = encoding.GetString(data, 0, rec);
                                Console.WriteLine("da nhan: "   mtam[i]);
                            }
                        write_xml(mtam[0], mtam[1], mtam[2], mtam[3]);
                        Console.ReadLine();
                        client.Close();
                    }
                    else
                    {
                        client.Send(encoding.GetBytes(command));
                        byte[] data = new byte[BUFFER_SIZE];
                        int rec = client.Receive(data);
                        Console.WriteLine("Server version: "   encoding.GetString(data, 0, rec)   "nClient version: "   clupdate);
                        if (clupdate == encoding.GetString(data, 0, rec))
                        {
                            command = "quit";
                        }
                        else
                        {
                            command = "update";
                            clupdate = encoding.GetString(data, 0, rec);
                            node.InnerText = clupdate;
                            doc.Save(xmlsvinfo);
                        }
                        // Console.ReadLine();
                    }
                }

                client.Close();
                // Console.ReadLine();

            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: "   ex);
                // Console.ReadLine();
            }
  

А вот и «Компьютер B»

 namespace Server
{
    class Program
    {
        private const int BUFFER_SIZE = 1024;
        private const int PORT_NUMBER = 7826;
        public static string xmlsvinfo = Directory.GetCurrentDirectory()   "\data\serverinfo.xml";
        public static string xmlpath = Directory.GetCurrentDirectory()   "\data\gamesinfo.xml";

        static ASCIIEncoding encoding = new ASCIIEncoding();
        static void Main(string[] args)
        {
            try
            {
                IPEndPoint iep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), PORT_NUMBER);

                Console.WriteLine("waiting for client...");

                Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                server.Bind(iep);
                server.Listen(10);

                Socket client = server.Accept();
                Console.WriteLine("Accepted: "   client.RemoteEndPoint.ToString());

                byte[] data = new byte[BUFFER_SIZE];
                string result = "";
                while (true)
                {
                    int rec = client.Receive(data);
                    string command = encoding.GetString(data, 0, rec);
                    Console.WriteLine("Client: "   command);
                    if (command.Equals("checkupdate"))
                    {
                        XmlDocument doc = new XmlDocument();
                        doc.Load(xmlsvinfo);
                        XmlNode node = doc.SelectSingleNode(@"root/UPDATE");
                        result = node.InnerText;
                    }
                    else if (command.Equals("update"))
                    {
                        XmlDocument doc = new XmlDocument();
                        doc.Load(xmlpath);
                        XmlNodeList nodelist = doc.GetElementsByTagName("gameinfor");
                        string dem = nodelist.Count.ToString();
                        client.Send(encoding.GetBytes(dem));
                        string dat = string.Empty;
                        for(int i = 0; i<nodelist.Count; i  )
                        {
                            for(int j= 0; j<4; j  )
                            {
                                dat = nodelist[i].ChildNodes.Item(j).InnerText;
                                client.Send(encoding.GetBytes(dat));
                                Console.WriteLine("sending "   dat);
                            }
                        }
                        Console.ReadLine();
                        client.Close();
                        break;
                    }
                    else if (command.Equals("quit"))
                    {
                        client.Close();
                        break;
                    }
                    else
                    {
                        result = "wrong command";
                    }
                    client.Send(encoding.GetBytes(result));
                    Console.ReadLine();
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: "   ex);
                Console.ReadLine();
            }
        }
  

Я попытался прочитать свой файл на компьютере B, а затем отправить его через сокет. компьютер A получит его и запишет в другой xml-файл на компьютере A. но это не сработает.

Здесь также используется мой метод «writexml»

 static void write_xml(string id, string name, string cata, string path)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(xmlpath);

            XmlNode gameinfor = xmlDoc.CreateNode(XmlNodeType.Element, "gameinfor", null);

            XmlNode nodeId = xmlDoc.CreateElement("ID_Game");
            nodeId.InnerText = id;

            XmlNode nodegamename = xmlDoc.CreateElement("Tên_Game");
            nodegamename.InnerText = name;

            XmlNode nodetheloai = xmlDoc.CreateElement("Thể_Loại");
            nodetheloai.InnerText = cata;

            XmlNode nodegamepath = xmlDoc.CreateElement("Path");
            nodegamepath.InnerText = path;

            gameinfor.AppendChild(nodeId);
            gameinfor.AppendChild(nodegamename);
            gameinfor.AppendChild(nodetheloai);
            gameinfor.AppendChild(nodegamepath);

            xmlDoc.DocumentElement.AppendChild(gameinfor);
            xmlDoc.Save(xmlpath);

        }
  

Комментарии:

1. «Какой метод мне следует использовать?» — я не думаю, что существует конкретный готовый метод для выполнения именно этого. Вероятно, вам нужно будет написать свой собственный.

2. Да, я знаю это, но после того, как я застрял с этим на 3 дня, я не знаю, что мне нужно сделать, чтобы исправить это.

3. Как я уверен, вы знаете, это сайт вопросов и ответов (а не форум или доска обсуждений) по конкретным проблемам программирования. Вам следует сосредоточиться на текущем препятствии, показать нам код, который у вас есть на данный момент (как можно меньше, чтобы полностью продемонстрировать проблему), описать ваши ожидания и проблему с текущим кодом.

4. Хорошо, я понимаю. я покажу свой код прямо сейчас.

5. Можете ли вы уточнить, «но это не сработает». ? Используйте отладчик для пошагового просмотра кода, если вам нужно получить дополнительную информацию.

Ответ №1:

Если вы хотите, чтобы файл был прочитан только для чтения, просто прочитайте файл, используя путь к файлу. Для этого нет необходимости использовать сокеты или so. С другой стороны, если вы хотите получить некоторую информацию с одного компьютера на другой, я предлагаю использовать сокеты.

Пример того, как прочитать файл на другом компьютере (локальной сети) без сокетов.

 using (var file = File.Open("//server/path/file.txt")) {...}
  

Комментарии:

1. Нужно ли мне предоставлять общий доступ к папке на компьютере «Server»?

2. Да, @RyoDejan. Для чтения файла вам необходимо сетевое общее местоположение или общая папка.

3. @RyoDejan «//» в начале пути — это префикс, указывающий на то, что файл находится в общей папке. Это путь к файлу Windows в формате UNC.