#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.