Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Программный код на с # в VIsualstudia. ⇐ ПредыдущаяСтр 3 из 3
//-------------------------------------------------------// ChatController.cs //-------------------------------------------------------// using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace serverChat { public static class ChatController { private const int _maxMessage = 100; public static List<message> Chat = new List<message>(); public struct message { public string userName; public string data; public message(string name, string msg) { userName = name; data = msg; } } public static void AddMessage(string userName, string msg) { try { if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(msg)) return; int countMessages = Chat.Count; if (countMessages > _maxMessage) ClearChat(); message newMessage = new message(userName, msg); Chat.Add(newMessage); Console.WriteLine("{0}: {1}", userName, msg); Server.UpdateAllChats(); } catch (Exception exp) { Console.WriteLine("Ошибка с доставкой: {0}.", exp.Message); } } public static void AddLsMessage(string userName, string msg, string au) { try { if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(msg) || string.IsNullOrEmpty(au)) return; int countMessages = Chat.Count; if (countMessages > _maxMessage) ClearChat(); message newMessage = new message(userName, msg); Console.WriteLine("{0}->{2}: {1}", userName, msg, au); Server.UpdateAllChatsLS(userName, msg, au); } catch (Exception exp) { Console.WriteLine("Ошибка с доставкой: {0}.", exp.Message); } } public static void ClearChat() { Chat.Clear(); } public static string GetChat() { try { string data = "#updatechat&"; data += String.Format("{0}~{1}", Chat[Chat.Count - 1].userName, Chat[Chat.Count - 1].data); return data; } catch (Exception exp) { Console.WriteLine("Ошибка с отправкой: {0}", exp.Message); return string.Empty; } } public static string GetChatLS(string userName, string msg, string au) { try { string data = "#lss&"; data += String.Format("{0}~{1}|{2}", msg, userName, au); return data; } catch (Exception exp) { Console.WriteLine("Ошибка с отправкой: {0}", exp.Message); return string.Empty; } } public static string GetSysMessage(string g) { try { string data = "#sys&"; data += String.Format(g); return data; } catch (Exception exp) { Console.WriteLine("Ошибка с обновлением чата: {0}", exp.Message); return string.Empty; } } public static string GetPeople() { try { string data = "#people&"; int countMessages = Server.Clients.Count; if (countMessages <= 0) return string.Empty; for (int i = 0; i < countMessages; i++)
{ data += String.Format("{0}|", Server.Clients[i].UserName); } return data; } catch (Exception exp) { Console.WriteLine("Ошибка в передаче информации о людях: {0}", exp.Message); return string.Empty; } } } } //-------------------------------------------------------// Client.cs //-------------------------------------------------------// using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace serverChat { public static class ChatController { private const int _maxMessage = 100; public static List<message> Chat = new List<message>(); public struct message { public string userName; public string data; public message(string name, string msg) { userName = name; data = msg; } } public static void AddMessage(string userName, string msg) { try { if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(msg)) return; int countMessages = Chat.Count; if (countMessages > _maxMessage) ClearChat(); message newMessage = new message(userName, msg); Chat.Add(newMessage); Console.WriteLine("{0}: {1}", userName, msg); Server.UpdateAllChats(); } catch (Exception exp) { Console.WriteLine("Ошибка с доставкой: {0}.", exp.Message); } } public static void AddLsMessage(string userName, string msg, string au) { try { if (string.IsNullOrEmpty(userName) || string.IsNullOrEmpty(msg) || string.IsNullOrEmpty(au)) return; int countMessages = Chat.Count; if (countMessages > _maxMessage) ClearChat(); message newMessage = new message(userName, msg); Console.WriteLine("{0}->{2}: {1}", userName, msg, au); Server.UpdateAllChatsLS(userName, msg, au); } catch (Exception exp) { Console.WriteLine("Ошибка с доставкой: {0}.", exp.Message); } } public static void ClearChat() { Chat.Clear(); } public static string GetChat() { try { string data = "#updatechat&"; data += String.Format("{0}~{1}", Chat[Chat.Count - 1].userName, Chat[Chat.Count - 1].data); return data; } catch (Exception exp) { Console.WriteLine("Ошибка с отправкой: {0}", exp.Message); return string.Empty; } } public static string GetChatLS(string userName, string msg, string au) { try { string data = "#lss&"; data += String.Format("{0}~{1}|{2}", msg, userName, au); return data; } catch (Exception exp) { Console.WriteLine("Ошибка с отправкой: {0}", exp.Message); return string.Empty; } } public static string GetSysMessage(string g) { try { string data = "#sys&";
data += String.Format(g); return data; } catch (Exception exp) { Console.WriteLine("Ошибка с обновлением чата: {0}", exp.Message); return string.Empty; } } public static string GetPeople() { try { string data = "#people&"; int countMessages = Server.Clients.Count; if (countMessages <= 0) return string.Empty; for (int i = 0; i < countMessages; i++) { data += String.Format("{0}|", Server.Clients[i].UserName); } return data; } catch (Exception exp) { Console.WriteLine("Ошибка в передаче информации о людях: {0}", exp.Message); return string.Empty; } }}} //-------------------------------------------------------// Program.cs //-------------------------------------------------------// using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using System.Net.Sockets; using System.Threading; namespace serverChat { class Program { private const string _serverHost = "localhost"; private const int _serverPort = 9933; private static Thread _serverThread; static void Main(string[] args) { _serverThread = new Thread(startServer); _serverThread.IsBackground = true; _serverThread.Start(); while (true) handlerCommands(Console.ReadLine()); } private static void handlerCommands(string cmd) { cmd = cmd.ToLower(); if (cmd.Contains("/getusers")) { int countUsers = Server.Clients.Count; for (int i = 0; i < countUsers; i++) { Console.WriteLine("[{0}]: {1}", i, Server.Clients[i].UserName); } } else { }} private static void startServer() { IPHostEntry ipHost = Dns.GetHostEntry(_serverHost); IPAddress ipAddress = ipHost.AddressList[0]; IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, _serverPort); Socket socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.Bind(ipEndPoint); socket.Listen(1000); Console.WriteLine("Сервер запущен по IP: {0}.",ipEndPoint); while(true) { try { Socket user = socket.Accept(); Server.NewClient(user); } catch (Exception exp) { Console.WriteLine("Ошибка: {0}",exp.Message); } }}}} //-------------------------------------------------------// Server.cs //-------------------------------------------------------//
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; namespace serverChat { public static class Server { public static List<Client> Clients = new List<Client>(); public static void NewClient(Socket handle) { try { Client newClient = new Client(handle); Clients.Add(newClient); Console.WriteLine("Пользователь {0} присоединился", handle.RemoteEndPoint); int countUsers = Clients.Count; UpdateAllUsers(); } catch (Exception exp) { Console.WriteLine("Ошибка с подключением нового клиента: {0}.",exp.Message); } } public static void EndClient(Client client) { try { client.End(); Clients.Remove(client); Console.WriteLine("Пользователь {0} отсоединился.", client.UserName); int countUsers = Clients.Count; for (int i = 0; i < countUsers; i++) { Clients[i].PeopleChat(); } } catch (Exception exp) { Console.WriteLine("Ошибка с отключением: {0}.",exp.Message); } } public static void UpdateAllChats() { try { int countUsers = Clients.Count; for (int i = 0; i < countUsers; i++) { Clients[i].UpdateChat(); } } catch (Exception exp) { Console.WriteLine("Ошибка с обновлением чатов: {0}.", exp.Message); } } public static void UpdateAllChatsLS(string userName, string msg, string au) { try { int countUsers = Clients.Count; for (int i = 0; i < countUsers; i++) { Clients[i].UpdateChatLS(userName, msg, au);
} } catch (Exception exp) { Console.WriteLine("Ошибка с обновлением чатов (ЛС): {0}.", exp.Message); } } public static void UpdateAllUsers() { try { int countUsers = Clients.Count; for (int i = 0; i < countUsers; i++) { Clients[i].PeopleChat(); }} catch (Exception exp) { Console.WriteLine("Ошибка с обновлением списка: {0}.", exp.Message); } }}} //-------------------------------------------------------// Клиенская часть //-------------------------------------------------------// using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading; using System.Data.SqlClient; using MySql.Data.MySqlClient; namespace chatClient { public partial class chatForm: Form { public class LS { public string chatls { get; set; } } List<LS> mesls = new List<LS>(); private delegate void printer(string data); private delegate void cleaner(); printer Printer; cleaner Cleaner; private Socket _serverSocket; private Thread _clientThread; private const string _serverHost = "localhost"; private const int _serverPort = 9933; int countls = 0; int sells = 0; string obh = ""; string[] ls = new string[999]; public chatForm() { InitializeComponent(); } private void listner() { while (_serverSocket.Connected) { byte[] buffer = new byte[8196]; int bytesRec = _serverSocket.Receive(buffer); string data = Encoding.UTF8.GetString(buffer, 0, bytesRec); if (data.Contains("#updatechat")) { UpdateChat(data); continue; } if (data.Contains("#sys")) { Sys(data); continue; } if (data.Contains("#people")) { People(data); continue; } if (data.Contains("#lss")) { Ls(data); continue; } } } private void connect() { try { IPHostEntry ipHost = Dns.GetHostEntry(_serverHost); IPAddress ipAddress = ipHost.AddressList[0]; IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, _serverPort); _serverSocket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); _serverSocket.Connect(ipEndPoint); } catch { print("Сервер недоступен!"); } } private void clearChat() { if (this.InvokeRequired) { this.Invoke(Cleaner); return; } chatBox.Clear(); } private void UpdateChat(string data) { string messages = data.Split('&')[1]; if (label5.Text == "Общий чат") { try { if (string.IsNullOrEmpty(messages)) { } print(String.Format("{0}: {1}", messages.Split('~')[0], messages.Split('~')[1]));
} catch { } } obh += String.Format("{0}: {1}|", messages.Split('~')[0], messages.Split('~')[1]); } private void Ls(string data) { // #lss&mess~userme|useran if ((userName.Text == data.Split('~')[1].Split('|')[0]) || ((userName.Text == data.Split('|')[1]))) { if ((label5.Text == data.Split('~')[1].Split('|')[0]) || (label5.Text == data.Split('|')[1])) { try { if (string.IsNullOrEmpty(data.Split('&')[1].Split('~')[0])) { } print(String.Format("{0}: {1}", data.Split('~')[1].Split('|')[0], data.Split('&')[1].Split('~')[0])); } catch { } } if ((label5.Text!= data.Split('~')[1].Split('|')[0]) && (label5.Text!= data.Split('|')[1])) { print(String.Format("У вас новое личное сообщение от: {0}", data.Split('~')[1].Split('|')[0])); }
int ki = 0; foreach (LS p in mesls) { if (p.chatls.Split('&')[0] == data.Split('|')[1]) { ki = 1; p.chatls += String.Format("{0}: {1}|", data.Split('~')[1].Split('|')[0], data.Split('&')[1].Split('~')[0]); } } if (ki == 0) { countls++; mesls.Add(new LS() { chatls = data.Split('~')[1].Split('|')[0] + "&" + String.Format("{0}: {1}|", data.Split('~')[1].Split('|')[0], data.Split('&')[1].Split('~')[0]) }); } } } private void Sys(string data) { string messages = data.Split('&')[1]; try { if (string.IsNullOrEmpty(messages)) { } print(String.Format("{0}", messages.Split('|')[0])); } catch { } } private void People(string data) { System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; string[] peoples = data.Split('&')[1].Split('|'); listBox1.Items.Clear(); listBox1.Items.Add("Общий чат"); int countpeoples = peoples.Length; if (countpeoples <= 0) return; for (int i = 0; i < countpeoples; i++) { try { if (string.IsNullOrEmpty(peoples[i])) continue; if ((peoples[i]!= "#people") && (peoples[i]!= userName.Text)) listBox1.Items.Add(String.Format("{0}", peoples[i])); } catch { continue; } } } private void send(string data) { try { byte[] buffer = Encoding.UTF8.GetBytes(data); int bytesSent = _serverSocket.Send(buffer); } catch { print("Связь с сервером прервалась...");} }
private void print(string msg) { if (this.InvokeRequired) { this.Invoke(Printer, msg); return; } if (chatBox.Text.Length == 0) chatBox.AppendText(msg); else chatBox.AppendText(Environment.NewLine + msg); } private void enterChat_Click(object sender, EventArgs e) { string Connect = "server=localhost;uid=root;password=--123--123--fh;persistsecurityinfo=True;database=work"; string CommandText = "SELECT Count(*) FROM account WHERE name = '" + userName.Text + "' AND pass = '" + textBox1.Text + "' LIMIT 1"; MySqlConnection myConnection = new MySqlConnection(Connect); MySqlCommand myCommand = new MySqlCommand(CommandText, myConnection); myConnection.Open(); myCommand.ExecuteNonQuery(); MySqlDataAdapter dataAdapter = new MySqlDataAdapter(myCommand); DataTable dt = new DataTable(); dataAdapter.Fill(dt); if (dt.Rows[0][0].ToString() == "1") { try { string Name = userName.Text; if (string.IsNullOrEmpty(Name)) {
} else { Printer = new printer(print); Cleaner = new cleaner(clearChat); connect(); _clientThread = new Thread(listner); _clientThread.IsBackground = true; _clientThread.Start(); send("#setname&" + Name); chatBox.Enabled = true; chat_msg.Enabled = true; chat_send.Enabled = true; userName.Enabled = false; listBox1.Enabled = true; textBox1.Enabled = false; label4.Text = "Вы подключены: " + userName.Text; userName.Visible = false; textBox1.Visible = false; label5.Visible = true; gui_userName.Visible = false; label1.Visible = false; enterChat.Enabled = false; enterChat.Visible = false; button1.Enabled = false; button1.Visible = false; label2.Visible = false; listBox1.Height = 355; } } catch { MessageBox.Show("Ошибка при подключении! Возможно, сервер не отвечает"); } } else { label2.Visible = true; } myConnection.Close(); } private void chat_send_Click(object sender, EventArgs e) { sendMessage(); } private void sendMessage() { if (!chat_msg.Text.Contains("#") &&!chat_msg.Text.Contains("|") &&!chat_msg.Text.Contains("~") && (label5.Text == "Общий чат")) try { string data = chat_msg.Text; if (string.IsNullOrEmpty(data)) { } else { send("#newmsg&" + data); chat_msg.Text = string.Empty; } } catch { MessageBox.Show("Ошибка при отправке сообщения!"); } else if (!chat_msg.Text.Contains("#") &&!chat_msg.Text.Contains("|") &&!chat_msg.Text.Contains("~")) try { string data = chat_msg.Text; if (string.IsNullOrEmpty(data)) { } else { send("#newls&" + data + "~" + userName.Text + "|" + label5.Text); chat_msg.Text = string.Empty; } } catch { MessageBox.Show("Ошибка при отправке сообщения!"); } } private void chatBox_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) sendMessage(); } private void chat_msg_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) sendMessage(); } private void chatForm_Load(object sender, EventArgs e) { } private void userName_TextChanged(object sender, EventArgs e) { } private void textBox1_TextChanged(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { string Connect = "server=localhost;uid=root;password=--123--123--fh;persistsecurityinfo=True;database=work"; string CommandText = "SELECT Count(*) FROM account WHERE name = '" + userName.Text + "' LIMIT 1"; MySqlConnection myConnection = new MySqlConnection(Connect); MySqlCommand myCommand = new MySqlCommand(CommandText, myConnection); myConnection.Open(); myCommand.ExecuteNonQuery(); MySqlDataAdapter dataAdapter = new MySqlDataAdapter(myCommand); DataTable dt = new DataTable(); dataAdapter.Fill(dt); if (dt.Rows[0][0].ToString() == "0") { CommandText = "INSERT INTO `work`.`account` (`name`, `pass`) VALUES ('" + userName.Text + "', '" + textBox1.Text + "');"; myCommand = new MySqlCommand(CommandText, myConnection); myCommand.ExecuteNonQuery(); } myConnection.Close(); } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { if (Convert.ToString(listBox1.SelectedItem) == "Общий чат") { label5.Text = "Общий чат"; clearChat(); string[] messages = obh.Split('|'); int countMessages = obh.Length; if (countMessages <= 0) return; for (int i = 0; i < countMessages; i++) { try { if (string.IsNullOrEmpty(messages[i])) continue; print(String.Format(messages[i])); } catch { continue; } } } else { int k = 0; foreach (LS p in mesls) { if (p.chatls.Split('&')[0] == Convert.ToString(listBox1.SelectedItem)) { label5.Text = Convert.ToString(listBox1.SelectedItem); k = 1; clearChat(); string[] messages = p.chatls.Split('&')[1].Split('|'); int countMessages = p.chatls.Length; if (countMessages <= 0) return; for (int l = 0; l < countMessages; l++) { try { if (string.IsNullOrEmpty(messages[l])) continue; print(String.Format(messages[l])); } catch { continue; } } } } if (k == 0) { label5.Text = Convert.ToString(listBox1.SelectedItem); clearChat(); mesls.Add(new LS() { chatls = Convert.ToString(listBox1.SelectedItem) + "&" }); } }}}} ЗАКЛЮЧЕНИЕ Изучение способов виртуальной коммуникации показало, что наиболее востребованными в современном обществе являются формы и способы синхронной коммуникации. Одним из средств такой коммуникации являются мессенджеры, т.е. системы мгновенного обмена сообщениями, главной особенностью которых является общение в режиме реального времени, практически мгновенная передача сообщения и получение ответа на него. В то же время очевидно, что популярные мессенджеры, такие как WhatsApp, Viber, Telegram, Facebook Messenger, Skype и другие, разработанные, прежде всего, для повседневного общения и развлечений, имеют, наряду с множеством достоинств (разнообразие функций, возможность пользоваться списком контактов, шифрование сообщений и т.п.) и серьезные недостатки с точки зрения использования их в профессиональном виртуальном общении в рамках организации. Таким недостатками являются, с одной стороны, переполненность мессенджеров разнообразным контентом, который носит развлекательный характер и, с нашей точки зрения, отвлекает от рабочей атмосферы и обстановки, а с другой – отсутствие полной гарантии безопасности корпоративной информации, поскольку переписка хранится на серверах конкретного приложения. Написанный нами программный продукт реализует такие задачи, как: - отсутствие развлекательных функций и контента, что позволяет работнику полностью сосредоточится на процессе работы; - обеспечение безопасности корпоративной информации за счет хранения ее на сервере организации, к которому нет доступа посторонним лицам. - простота регистрации и пользования мессенджером, что актуально в условиях разного уровня пользовательских навыков сотрудников организации. Таким образом данный мессенджер можно использовать в организациях для выполнения быстрой связи сотрудников между собой, без отвлечения на посторонние ресурсы.
Доработка данного мессенджера в дальнейшем может идти по таким направлениям, как: возможность пересылать документы для ознакомления; разработка мобильного приложения для использования на смартфонах, возможность использовать приложение не только в стенах организации, но из других мест в случае выезда в командировку.
СПИСОК ЛИТЕРАТУРЫ 1. Апетян М. К. Особенности виртуальной коммуникации // Молодой ученый. — 2015. — №3. — С. 939-941. — URL https://moluch.ru/archive/83/15418/ (дата обращения: 17.05.2019). 2. Официальный сайт Facebook Messenger: https://www.messenger.com/ (дата обращения: 17.05.2019). 3. Официальный сайт Microsoft (Бесплатная версия Visual Studio): https://visualstudio.microsoft.com/ru/free-developer-offers/ (дата обращения: 17.05.2019). 4. Официальный сайт Skype: https://www.skype.com/ru/ (дата обращения: 17.05.2019). 5. Официальный сайт Viber: https://www.viber.com/ru/ (дата обращения: 17.05.2019). 6. Официальный сайт WhatsApp: https://www.whatsapp.com/?l=ru (дата обращения: 17.05.2019). 7. Официальный сайт Телеграм: https://tlgrm.ru/(дата обращения: 17.05.2019). 8. Руководство по языку C# /Официальный сайт Microsoft: https://docs.microsoft.com/ru-ru/dotnet/csharp/ (дата обращения: 17.05.2019). 9. Система мгновенного обмена сообщениями /https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BC%D0%B3%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8 (дата обращения: 17.05.2019). [1] Апетян М. К. Особенности виртуальной коммуникации // Молодой ученый. — 2015. — №3. — С. 939-941. — URL https://moluch.ru/archive/83/15418/ (дата обращения: 17.05.2019). [2] Там же. [3] Система мгновенного обмена сообщениями /https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BC%D0%B3%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BE%D0%B1%D0%BC%D0%B5%D0%BD%D0%B0_%D1%81%D0%BE%D0%BE%D0%B1%D1%89%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8 (дата обращения: 17.05.2019). [4] Официальный сайт WhatsApp: https://www.whatsapp.com/?l=ru (дата обращения: 17.05.2019). [5] Официальный сайт Viber: https://www.viber.com/ru/ (дата обращения: 17.05.2019). [6] Официальный сайт Телеграм: https://tlgrm.ru/(дата обращения: 17.05.2019). [7] Официальный сайт Facebook Messenger: https://www.messenger.com/ (дата обращения: 17.05.2019). [8] Официальный сайт Skype: https://www.skype.com/ru/ (дата обращения: 17.05.2019).
|
|||||||||
Последнее изменение этой страницы: 2020-11-28; просмотров: 96; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.83.150 (0.355 с.) |